完成 2.0.0 S4 的外部 AI、admin、account 与 solo SQL 收口,并推进 S5 studio 市场/handoff/旧编辑器入口裁剪。S5 的前端单测、构建与 route-only e2e 已留证;MSW-off 创作主线 e2e 仍因本地后端活体启动口径待修正,已在总账标为未完成验收。
255 lines
185 KiB
Markdown
255 lines
185 KiB
Markdown
# 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%)、五类系统性病灶、E0–E7 待做 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 后真实调用 Dify,chat 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/0S;AI/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/0S;knowledge 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 200;coverage 计数核验 `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 passed;S5 隔离 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 证据。
|
||
|
||
**E1 content 创作闭环切片(2026-06-27)**:已补 AI suggestion 采纳归档、前端“改后合并”入口、IndexedDB 草稿键对账、旧知识草稿失效、工作台知识/导入/导出/记录入口、Block 版本历史最小 API/UI。Content merge 写 Canonical 与来源归因后,必须由 AI owner 写 `accepted` 状态、accepted decision archive、AI command、business audit;AI owner 不可用时整笔 merge 回滚,避免 Canonical 已写但候选仍 pending。Content 正文变更后通过 Knowledge owner API 将关联 pending draft 标为 `conflicted/needs_recheck` 并写 Knowledge draft decision archive;通知失败不回滚 Canonical 主写,Knowledge confirm 端仍按来源状态 fail-closed。Studio `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/0E;real-PG `P1rContentCoreCompletedApprovalIT` 13/0F/0E/0S + `P1rContentMergeSuggestionIT` 5/0F/0E/0S + `P1rContentMergeGeneratedSuggestionIT` 1/0F/0E/0S;studio `tsc -b --force` 通过、lint 0 errors、Vitest 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 160→161、AI 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、初始版本自动创建、版本列表/激活/归档非当前版本、作品槽位 unbind、Studio 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/0E;studio `tsc -b --force` 通过、目标 ESLint 0 errors、Vitest 29/0F/0E;MSW-off Playwright 真后端 `agent-create.spec.ts`+`agent-slot-bind.spec.ts`+`accept-suggestion.spec.ts` 5/0F/0E:采纳真生成 suggestionId=80、Block revision 161→162、accepted decision archive 非空;拒绝真生成 suggestionId=81、`status=rejected`、decision archive 非空;Agent 生命周期 DB 核验 v1/v2 current 切换与 v2 archived;Slot unbind DB 核验 revision 2→3、status 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/0S,coverage JSON 当前 242/242;studio 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`,不再送入 RAGFlow。Studio 市场详情页补三类可信信息面板(来源引用/当前授权/治理状态)。fresh 证据:后端 E4 targeted `MuseAgentSlotServiceTest`+`AdminMarketGovernanceServiceTest`+`MuseKnowledgeSourceEventServiceTest`+`KnowledgeMarketSourceStatusChangedConsumerTest` 50/0F/0E;契约/覆盖门 `ContractFirstGateTest`+`P1rApiCoverageReportTest` 12/0F/0E;studio 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 全量 56;KB 副本资源回收、下架/撤权更细补偿后置。
|
||
|
||
**E5 member 写侧闭环(2026-06-27)**:已补 AI→Account 用量/配额真实写链路、New-API 管理口 Real facade、quota request consumer、attribution job consumer。AI 生成入口先经 Account owner 预占配额,成功后写 `muse_member_usage_record` 并累加 quota used,失败终态释放预占;`AccountQuotaRequestWorker` 以短事务 claim/terminal、外部 New-API 调用 tx 外执行,推进 queued→completed/failed;`AccountAttributionWorker` 消费 queued attribution job,按 usage correlation 写 attribution item 并标终态。`RealNewApiAccountFacade` 显式禁用系统代理,避免 macOS 系统代理把 tailnet 管理口误判为外部 5xx;配置默认 fail-closed,worker 默认 disabled。fresh 证据:后端 E5 targeted 单测 120/0F/0E;account real-PG `P1rAccountQuotaRequestCompletedApprovalIT` 5/0F/0E/0S + `P1rAccountAdminWritesCompletedApprovalIT` 3/0F/0E/0S + `P1rAccountNewApiBindingClusterCompletedApprovalIT` 4/0F/0E/0S + `P1rAccountUsageObservabilityCompletedApprovalIT` 4/0F/0E/0S;New-API 管理口 live `RealNewApiAccountFacadeLiveAcceptanceIT` 显式 opt-in 1/0F/0E/0S,quotaApplied=100000000 且只输出 hash/布尔脱敏证据;AI runtime live `P1rAiRuntimeEndToEndLiveAcceptanceIT` 3/0F/0E/0S,反查 usage record=1、quota used=1、reserve audit=1、attribution job/item completed;AI/member/server `test-compile` 通过。边界:未跑前端 e2e;默认未 opt-in 的 New-API live 为 honest skipped,不计为 passed;E6 进入 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/0S;AI targeted `MuseAgentServiceTest`+`AdminMuseAgentControllerAnnotationTest` 31/0F/0E/0S,`MuseToolGrantServiceTest`+`LocalSecurityToolGrantApprovalFacadeTest` 13/0F/0E/0S;muse-admin 账号治理 Vitest 50 files / 345 tests passed;AI 配置目标 Vitest 2 files / 9 tests passed;`@vben/web-antd typecheck` 通过;契约/覆盖门 `ContractFirstGateTest`+`P1rApiCoverageReportTest`+`P1rAiRouteOwnershipTest`+`P1rAiRealApiGateTest` 27/0F/0E/0S;market real-PG `P1rMarketAdminAppealCompletedApprovalIT` 7/0F/0E/0S 覆盖 restored 分支 preview consumed、asset relisted、restore governance action、command/event 幂等;system+server `test-compile` 通过。边界:未跑 Admin Playwright e2e;system 角色菜单/数据范围沿用 Yudao 既有模型;质量策略回滚仍是 preview-only/线 B;E7 进入 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/migrationHint;Meta 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/0S;real-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/RAGFlow,server live 8/0F/0E/0S + module live 4/0F/0E/1S,`BUILD SUCCESS`。唯一 skip 为 GraphRAG attribution 独立 opt-in 未配置,不计为线 A passed;New-API completion、AI runtime usage/quota/attribution、RAGFlow upload/parse/retrieval、Knowledge runtime、Market KB D0-fork 与 after-commit 均真跑通过。本轮 real-PG 先暴露并修正 1F/2E:market 召回断言从旧 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 warning、Vitest 27 files/119 tests passed、MSW-off Playwright 全量 61 tests=60 passed/1 skipped/0 failed;Admin `@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 skip、Studio 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` 返回稳定存储 path;Content 外部上传任务只接受 infra 稳定 path 并通过 FileApi 读真字节扫描,非 passed fail-closed,不再接受任意外链 URL;AI 新增 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-closed,408/429/5xx/连接超时可重试并带退避,provider 原文和凭据不落日志/证据。Knowledge 新增 draft creation owner API,章节确认只创建 pending Knowledge Draft,不直写 Local KB Canonical。Studio `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 / 1S,New-API live LLM 完整链路显式 opt-in 1/0F/0E/0S;Studio 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-API),DB 反查 parse job completed、2 条 confirmed Shadow、2 条 pending Knowledge Draft、Canonical 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 master,DB 反查导出任务 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/0E;Studio `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;不调用外部 LLM。fresh 证据: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 passed;Studio `tsc -b --force` 通过;目标 ESLint 0 errors;`git diff --check` 通过。边界:偏好/通知页仍无 app 写契约,真实改密/2FA/session service 会话吊销仍后置;撤权执行仍在 admin 治理侧,普通用户侧只做治理结果申诉。
|
||
|
||
**market 写路径整改(2026-06-14,ultracode)**:member 暴露写端口 `MuseAccountRecordProjectionApi` + DTO(member-server 实现读写自有 DAL、tenantId 由实现侧从上下文注入防伪造、事务沿用调用方),market 5 类改消费端口、移除 member.dal 依赖 → `KNOWN_VIOLATION_EXEMPTIONS` 清空、BC 门全绿。**附带修复**:round-2 重构 `ContentKnowledgeWorkOwnerFacade` 时遗留的旧测试 `KnowledgeWorkOwnerFacadeTest`(仍断言旧 WorkMapper 行为)已删除,其装配守卫/兜底两用例并入 `ContentKnowledgeWorkOwnerFacadeTest`(5/0F)——此为 round-2 一处假绿(当时构建在平台时区用例处中止、未真正跑到 knowledge),现已补正。
|
||
|
||
**后续基建 TODO**:openapi-diff 远端 CI 首跑验证(🔧 检测逻辑+循环聚合已本地实证 2026-06-17:oasdiff v1.19.1 对 7 域真实契约 5/5 拦真破坏/放行安全演化,镜像钉版本+复现脚本已落地;2026-06-19 已把 workflow 从 `muse-cloud/.github/workflows/` 移到仓库根 `.github/workflows/`,修正自建 Gitea Actions 只扫描根 workflow 的接线问题;**仅余远端真实 PR 首跑确认**:`pull_request` paths 触发、`base.sha` worktree、docker 镜像拉取、Gitea Actions 是否已启。**`mvn -B package`[CI 确切命令]已本地实证全绿(2026-06-17,全 reactor 单测 + 打包步骤),接线后即应绿**——属远端基建首跑,留人类)。✅ 已完成项:`connectAIStream` SSE 契约漂移收口(2026-06-19 targeted Vitest:`sse.test.ts` + `AIPanel.contract.test.tsx` 17/17,按真实后端 `event:` 行解析且 Long suggestionId→string)、`muse-module-ai-contract-server` 空壳孤儿清理(2026-06-19:从 AI reactor 移除、删除唯一 pom、`P1rAiRouteOwnershipTest` 加回潮门禁)、`dev-baseline` 收敛进 rules(2026-06-19:新增 `engineering-conventions` + `security-and-reliability`,旧 `docs/dev-baseline/**` 降级历史归档并由 `AgentsInfraIntegrityTest` 索引门兜底)、`completed=测试证据`兜底(2026-06-19:coverage JSON 增 `testFiles`;生成器 `--check` + `P1rApiCoverageReportTest` 校验 completed 必须引用真实 `src/test/java` 证据文件且不得引用 coverage/gate 自身)、跨域 `.application` 边界门(2026-06-17:BcBoundaryArchTest 0 违例 + 反向证 238 例非空转)、market-server→member-server pom 坐标收口(2026-06-17:market-server 收窄至 member-api + tenant starter 直接声明)、ai/平台预存红测试整改(2026-06-15~17:三项全清)。
|
||
|
||
**🎯 全 reactor `mvn test` 史上首次全绿(2026-06-17)**:本特性分支 30+ commit 从未 push、maven.yml 只在 push/PR-to-main 触发故 **CI 从未在本分支真跑过**,积累若干潜伏红。以 `mvn -pl muse-server -am test -fae` 全 reactor 排查,逐模块解锁(上游失败 fail-fast 会 SKIP 下游),共清 **6 处**:① market `AppMuseMarketPublishControllerTest` 9 参 `PublishRecordItem` 构造(record 自 a00c758 加 marketAssetId/appealStatus 变 10 参)② coverage 台账 33 op serviceFiles 陈旧引用(本会话 facade 移 member-api 所致)③④ knowledge/ai 的 `Content*WorkOwnerFacadeTest` 仍断言 `@ConditionalOnBean`(2026-06-14 单体修复已去除、改 @Primary)⑤ ai `MuseAiEventPublishOutboxMapperTest` 真 PG 用例无 PG 时硬 fail→改 `assumeTrue` skip(与 P1r external-acceptance env 缺失即 skip 约定一致、honest 非假绿)⑥ muse-server `P1rKnowledgeMigrationSqlTest` 元测试钉死 `TARGET_VERSION="14"`(IT 已按 4d46d7a 动态自适应)→版本无关化。**全 reactor BUILD SUCCESS、0 失败**(真 PG 类无 PG 时 skip)。教训:跨模块重构后须跑 `-fae` 全量,勿只跑改动模块。**前端 muse-studio 同步复验绿(2026-06-17:`tsc -b` 0 错误 + `vitest run` 12 文件/47 用例全过;本分支前端改动 35 文件全在 studio、admin 未动)**——故**整分支(后端 `mvn -B package` + 前端 `tsc`/`vitest`)deterministic CI 检查全绿,均本会话实证**(e2e/playwright 需活体后端+浏览器,未在本轮跑;真 PG IT 多数 2026-06-17 已人工批准且本会话变更为 import-only+单测已覆盖,未重跑)。
|
||
|
||
---
|
||
|
||
## 二、产品 / 模块进度(指针,勿在此重复细节)
|
||
|
||
- 各模块目标 / 边界 / out-of-scope / 现状 / TODO → 见对应 **`muse-cloud/muse-module-*/.agent`**。
|
||
- 真实完成度与逐项证据 → 见 [现状基线 spec §四/§五](../agent-specs/2026-06-13-项目目标与模块现状基线.md)。
|
||
- 接口完成台账(门禁批准口径,≠端到端可用)→ `P1rApiCoverageReportTest` + `docs/superpowers/reports/p1r-api-coverage.json`;completed operation 现在必须带 `testFiles` 证据锚点。
|
||
|
||
| BC 模块 | 只读评估 | `.agent` |
|
||
|---|---|---|
|
||
| AI 编排 (ai) | 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) |
|
||
| 账户/个人中心 (account→member) | 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 五切片(V17–V21 outbox)
|
||
2026-06-09→13 Events/Meta/Account/Market/Content 分批 completed approval(coverage→147/233)
|
||
2026-06-13 现状基线 + 对抗复盘(诊断"假绿")+ P0 止血(CI 真跑测试/JDK21/去硬编码)
|
||
2026-06-14 Agent 开发基建六砖(BC 门 + 契约门 + .agents 中枢 + 单一总账)+ 历史文档清理
|
||
2026-06-14 P1 harness 验证:消除 BC 违例 ContentMuseWorkOwnerFacade(content-api 端口 + AI 改消费)→ ArchUnit 豁免删除、门禁收紧(反向红 31 例 / 正向绿;13+7 单测)
|
||
2026-06-14 P1 market 写路径整改(ultracode):member 暴露 MuseAccountRecordProjectionApi 写端口 + DTO,market 5 类去 member.dal → 豁免清空、BC 门全绿;附带补正 round-2 knowledge 旧测试假绿(JDK21 scoped 实跑:BcBoundary 1/0F+0 违例、knowledge 5/0F、member 4/0F、market 5 类全绿、契约/loop/覆盖门全绿,BUILD SUCCESS)
|
||
2026-06-14 P1 后端 real-PG IT 验收:接通共享远端 PG(100.64.0.8:5433,PG17.10;破本机 SOCKS 代理破坏 PG 协议的坑)真跑 20 个 P1r*IT,**19/20 类零功能失败**(~95 用例绿,含 completed-approval/Flyway 迁移/events-publish outbox + New-API live)。唯一红=P1rKnowledgeFlywayMigrationIT 硬编码断言 V14(schema 已 V21,陈旧用例,源自 commit 7155285、非本轮)。配方+代理坑入 [.agents/knowledge §四](../../.agents/knowledge/external-deps-and-gotchas.md)。
|
||
2026-06-14 MVP #1 纵切(AI候选→采纳入正文,据现状基线 §6.3 #1):前端真实编辑器(WorkspacePage)接入唯一合法入口 suggestion-merges——新增 useAcceptSuggestion + client 注入 Bearer + AIPanel 透传 suggestionId + CandidatePanel 异步防双写,**去除本地 setContent 绕过双轨主权**、connectAIStream 复用 createEventStreamParser 对齐真后端 SSE `event:` 线(修掉旧 `data.type` 漂移)(studio tsc/**47 单测**/build 全绿)。后端新增机械门禁 `P1rContentMergeSuggestionIT`:真实 PG + 真实 `AiSuggestionMergeProjectionFacade` 读真种 muse_ai_suggestion,**5/5 绿**(正向写 Canonical revision1→2/revision 冲突/幂等回放/非 pending/审缺失)。**未达(诚实)**:活体 UI e2e 未跑——阻塞于①远端 dev 库缺 yudao 基座 schema(system_tenant,全栈 app 起不来,需 provision)②AI 运行时未写「审」字段(生成流候选不可合并,chip task_092cfc32);均范围外。connectAIStream 的 SSE parser 漂移**已在本提交修复**。`e2e/accept-suggestion.spec.ts` 已写(只写不跑)。
|
||
2026-06-14 AI「审」字段补齐(消除「生成候选永不可采纳」缺口,chip task_092cfc32):新增 `MuseAiCandidateReviewService`(真实轻量审——输出合规扫描/静态检查/许可快照,通过才给可追溯审结果 ID,否则不给→门禁如实拒绝);`MuseAiRuntimeProjectionService.createRuntimeSuggestion` 现写顶层 content(脱敏 summary)+ 三审字段 + `source_status`='active'(修 'verified')+ 数值授权快照(沿用 runtime permission envelope=authz 既有约定)。机械门禁 `P1rContentMergeGeneratedSuggestionIT`(真实 PG):经真实 `createShadowSuggestionCandidate` 产候选→断言 active/审/authz/content 由真实代码产出→`mergeBlockSuggestion`(merge_after_edit)写入 Canonical。验证:`MuseAiCandidateReviewServiceTest` 5/0、`MuseAiRuntimeProjectionServiceTest` 5/0(回归)、`P1rContentMergeGeneratedSuggestionIT` 1/0、`P1rContentMergeSuggestionIT` 5/0 = **16/16 绿**。遗留:非数值 envelope id 暂无法落 BIGINT 授权快照列(已知列能力限制),待授权快照建模收口。
|
||
2026-06-14 全栈 app 启动攻坚(为活体 e2e):实测推进,拆两墙、定位第三墙。①墙1 修复:member-server repackage 配 classifier=exec(commit 1f89007)→ 全项目 `mvn package` 由"破损"变 BUILD SUCCESS、产出 muse-server.jar(此前 d38260f 的市场整改只验 test 未验 package,是假绿)。②墙2 解决:本仓原无 postgres 基座 dump(只有 H2 测试 schema),已把 system/infra/member 的测试 schema 忠实翻为 PostgreSQL(49 表,实测 0 失败)+ 最小启动种子(system_tenant id=1),固化到 `muse-cloud/sql/dev/yudao-base-schema-postgres.sql` + `yudao-base-seed-postgres.sql`;灌入 muse_slice_live 后 app 的 Flyway(baseline-on-migrate)成功补 Muse V1-V21、Tomcat 起、Spring 初始化。③墙3(定位,未解,开 chip):muse-server 卡在 bean 装配——`PermissionCommonApi` 等 5 个 `biz.system` CommonApi 是 **@FeignClient(yudao-cloud RPC)**,单进程单体下无人提供本地 bean。即**本项目从未以单体真正启动过(基线"未实跑"的根因)**,需「阶段7 工程承接」补一层"CommonApi→system 本地 impl"的单体 RPC 桥接(真实桥接,非 permissive stub——stub 会造假绿启动)。这是项目级架构整合,非 MVP 纵切范围。**MVP #1 纵切本身仍以 4 个真实 PG IT 为正确性证据(未受影响)。**
|
||
2026-06-14 ✅ **全栈 muse-server 史上首次单进程单体成功启动 + MVP #1 活体端到端跑通**(ultracode)。**墙3 诊断证伪**:初判"需 Feign RPC 桥接"错,真因是 ①system/infra/ai-server 也缺 classifier=exec(fat-jar 嵌套致类不可加载,commit eea10b7)②Spring 条件注解 `@ConditionalOnBean/Missing` 在 `@Service/@Component` 上不可靠→facade 装配非确定性失败,改 `MonolithFacadeFallbackAutoConfiguration`+去条件(commit d09d529)③`@Resource` 跨模块 bean 名撞名(AccountExport 的 exportTaskMapper)重命名 ④codegen.import-enable 缺省 ⑤本机 SOCKS 代理破坏 PG(`-DsocksProxyHost=`)——`PermissionApiImpl` IS-A `PermissionCommonApi`,类可加载后 bean 自满足,**全程零 Feign 桥接、零 permissive stub**。**实测**:`Started MuseServerApplication in 17.985s`(Tomcat 48080,连 muse_slice_live);curl 真打:`GET /works`→`{"code":0,total:1}`;`POST .../suggestion-merges`(accept_as_is,种子 work1/block1/sugg1)→`code:0,newRevision:2,sourceAttribution(ai_suggestion)+lineage`;reload 块 `content_text=AI候选正文、revision=2`;负路径陈旧 revision=99→`code 1041000002 乐观锁拒`(反假绿)。**MVP #1 纵切(AI候选→采纳入正文)在真实 HTTP+mock鉴权+租户过滤+真实 PG 上活体闭环**。全栈起法+活体命令固化入 [.agents/knowledge §六](../../.agents/knowledge/external-deps-and-gotchas.md)。**遗留**:studio 渲染层 UI e2e(Playwright,`accept-suggestion.spec.ts`)依赖 vite dev + 联调生成流,后端活体已 curl 证;非阻塞。
|
||
2026-06-15 ✅ **studio 整套活体 e2e 单次全绿 8/8**(承 MVP#1 长板):关 MSW(VITE_API_MOCK=false,固化进 playwright.config webServer env + .env.local)、vite 代理→真实单体 48080、chromium 真跑——accept-suggestion 正+负(DB 实证 block3 rev1→2 + AI摘要正文 + ai_suggestion 归因落库)、knowledge-confirm(种 pending 草稿→确认→draft confirmed + 新建 Canonical entity)、live-read 4 读旅程、workspace 壳。修红:workspace.spec.ts 原 mock 假绿(断言「星海迷途」)MSW-off 下必红→改不依赖 mock 壳冒烟。读 ContentSourceServiceImpl 证 merge 校验序 requireRevision 先于 pending(正负可并行)。诚实遗留:e2e 暂依赖 /tmp 助手手动 reseed,待补 playwright global-setup 自播种。
|
||
2026-06-15 ✅ **studio 市场生产侧发布草稿纵切活体绿 + 修真实潜伏后端 bug**(承前端长板,goal 主攻):新增 `MarketPublish`(/market/publish)生产侧表单 + `useMarketPublish` hook;保存发布草稿(POST /marketplace/publish-drafts)→ my-publish-records 真实回读,`market-publish.spec.ts` chromium MSW-off 正+负绿,DB 证 muse_market_publish_draft 落库(status=draft);整套 e2e 10/10 + vitest 47/47 无回归。**修真实 bug**:publish draft/check/request 的 (tenant_id,command_id) 部分唯一索引(V15)与 mapper 无谓词 `ON CONFLICT` 不匹配→PG 报 no unique constraint matching→savePublishDraft 500(链路从未活体跑过、潜伏至本切片);修=部分→完整唯一索引(V22 迁移 + muse_slice_live 已应用)。遗留:其余 market 表(handoff/appeal 等)同类部分索引待收口。
|
||
2026-06-15 🔎 **account facade 活体订正(无净代码改动,反假绿)**:user 据 §五A"account 21 端 UNAVAILABLE"选"account 后端 facade 真实化"。Explore 静态分析判 MarketAccountProjectionFacade 阻塞 purchases/licenses/publish-records;**实测推翻**——单体内 market `MarketAccountProjectionProvider`(@Service)本身 implements MarketAccountProjectionFacade、对三类型放行,`@ConditionalOnMissingBean` 使其压过 member 的 Unavailable 兜底 → 三端在单体本就可用。curl 真返投影(含 market-publish e2e 写入的 publish-records 5 条=market→account 端到端)。曾据 Explore 加 member-local `RealMarketAccountProjectionFacade`+改 autoconfig、rebuild+restart 验证;**可逆翻转测试(全局 purchase=0 仍返回空而非 UNAVAILABLE)证实活跃 facade 是 Provider 而非我的 count-gating facade → 单体 no-op 且违背原设计,已回退**(member 模块工作树干净)。顺带:restart 时 Flyway 真实应用 `V22`(market 索引修复)"Successfully applied 1 migration ... v22"。结论:单体无 account facade 接线缺口待补;export/new-api 为正确 fail-closed 外部依赖。教训:跨 BC facade 判定必须以单体实跑为准,静态分析会漏 monolith 跨模块 bean 绑定。
|
||
2026-06-15 ✅ **market 残余 partial-index 系统性收口 + 真实 PG IT(V23)**:续 V22,修 handoff_event/appeal_material/authorization_summary/appeal_event/appeal 5 表 (tenant_id,command_id) 部分→完整唯一索引(grep 实证其 mapper 发无谓词 ON CONFLICT,潜伏同 publish 链路 bug)。新增 `P1rMarketCommandIndexFlywayMigrationIT`:真实 PG clean→迁移 V1→V23(Flyway "Successfully applied 23 migrations ... v23")→断言 V22/V23 修复的 9 个命令索引均完整唯一(可作 ON CONFLICT 仲裁器),**Tests run 1, Failures 0, Errors 0, Skipped 0**(与 target=V15 的 `P1rMarketFlywayMigrationIT`「断言历史 partial 态」互补)。V23 已应用 muse_slice_live + 全新 `muse_p1r_cmdidx_test` 库迁移验证。其余 market 部分 command 索引未被当 arbiter,保持不变。
|
||
2026-06-15 ✅ **知识库工作台知识图谱视图 + 修 confirm 重名潜伏 500(承前端长板,goal 主攻)**:①前端新增 `KnowledgeGraphPanel`(/knowledge/:workId)经 GET /works/{id}/graph 读真实 muse_knowledge_entity/relation,渲染已入库 Canonical 实体(节点)+关系(边),与草稿面板成"候选→确认→正式图谱可见"双轨闭环;`knowledge-graph.spec.ts` chromium MSW-off 绿 + curl 证 code:0/节点 huotituopusuqing+huoti_related 边。②**修真实潜伏后端 bug(反假绿,task_497da70f)**:confirm 重名实体(同 work+类型+规范名+范围)原触发 uk_muse_knowledge_entity 唯一冲突→未捕获 DuplicateKeyException 冒泡 HTTP 500;改 `writeCanonicalEntity` 前置 `selectByIdentity` 预检(镜像约束列、不滤 deleted)→`markConflicted`(REQUIRES_NEW)+`KNOWLEDGE_ENTITY_DUPLICATE`(1043002004);必须前置预检——PG 约束冲突使当前事务 aborted,catch 后任何写必失败。活体证:colliding 草稿 confirm→code 1043002004(非 500)、DB 草稿转 conflicted+实体数不变(无伪造重复);正路径 knowledge-confirm e2e 回归绿;tsc -b 干净 + vitest 47/47。
|
||
```
|
||
|
||
---
|
||
|
||
## 五、master plan(P1R-7 端到端验收)收口清单 —— 活 backlog(2026-06-14 起,goal: master plan complete)
|
||
|
||
> master plan = P1R(总 spec→阶段 spec/plan,P1R-0…P1R-7,见 [p1r-stages](../explainers/muse-cloud/content/p1r-stages.md))。P1R-0~6 各 BC Real API 门禁口径基本就位;**收口主体 = P1R-7 端到端验收**,其阻塞 = [现状基线 §6.3](../agent-specs/2026-06-13-项目目标与模块现状基线.md) 最危险缺口 Top 6。本清单为该 goal 的唯一驱动 backlog,**就地更新、勿另起过程文档**。状态:✅完成 / 🔧进行 / ⬜未起 / ⏸判定范围外。
|
||
|
||
> **goal 主攻 = 活体纵切·每 BC 一条端到端用户旅程,在跑起来的单体(48080)上 curl 实证(正+负路径),验收=achieve the product goal。** per-BC 活体度量:
|
||
> - **content+ai**(AI 候选→采纳入正文):✅ 活体证(MVP#1;正:newRevision=2+正文写入;负:乐观锁 1041000002)+ ✅ **前端 rendered UI e2e**(chromium,关 MSW 直连活体:生成→采纳→真合并 happy + 乐观锁 negative,见 §五C)
|
||
> - **knowledge**(确认草稿 Shadow→Canonical 实体):✅ 活体证(2026-06-14;正:GET pending→POST confirm→`muse_knowledge_entity` 落库+草稿 confirmed;负:revision 1043002001 / source-stale 1043002002→草稿 conflicted)+ ✅ **前端 rendered UI**(确认入库 e2e chromium,见 §五C)+ ✅ **知识图谱视图**(graph rendered-UI 活体证,2026-06-15)+ ✅ 修 confirm 重名 500→干净冲突 1043002004
|
||
> - **market**(资产采纳/安装):✅ 活体证(2026-06-14;正:GET listed 资产→purchase `licenseId:1/active`→install `installationId:1/installed`;DB:授权快照+购买事实 completed+安装 installed 三落库;purchase 经 MarketAccountProjectionProvider 投影 account) + ✅ **生产侧发布草稿 rendered-UI e2e**(2026-06-15;/market/publish→publish-drafts→my-publish-records,DB 证 publish_draft 落库;附带修 publish 部分索引 ON CONFLICT bug→V22,见 §五C)
|
||
> - **account/member**(个人中心:profile/purchases/licenses/entitlements/usage 读):✅ 活体证(2026-06-14;profile 返回脱敏 PII;**purchases/licenses 含上一步 market 购买+安装的投影=market→account 跨 BC 端到端通**;entitlements/usage 干净空数据)。**重要订正**:此前 account 读 500 真因是基座 schema 漏 `member_user.register_terminal` 列 + 缺 `infra_api_error_log_seq`(非 facade 缺口),已补基座文件 `yudao-base-schema-postgres.sql`(可复现);baseline "21/33 阻于 facade" 部分被推翻——投影通、卡在基座。
|
||
> - **agent(ai)**(创建/列表):✅ 活体证(2026-06-14;POST /muse/agents→`agentId:1`→GET 列表含之 active;试用 New-API 外部,非阻)
|
||
> - **events**(SSE 事件流):✅ 间接证(AI 候选生成走 connectAIStream SSE;events BC streamEvents 已双评审真实 PG IT,coverage completed)
|
||
> - **meta**(admin 治理发布):⏸ 阻于 MetaImpact 用量投影特征(见 A;admin 侧、非核心用户旅程)
|
||
>
|
||
> **总评(2026-06-14)**:**后端产品目标已实质达成**——核心用户旅程("AI 先审后入"创作 + 知识确认 + 市场采纳 + 个人中心 + 智能体)在跑起来的单体(48080)上**端到端活体证毕(正+负路径,反假绿)**,含 market→account 跨 BC 投影。**仍缺**:前端 studio 渲染层(仅 ~14% 真连,B3 大长板)→"用户在 UI 里点"未全达;meta admin 治理(特征缺口);market 生产侧发布 UI。下一主攻=前端逐旅程接活体 + playwright。
|
||
|
||
### A. 后端跨 BC facade 真实化(B2,非 stub,真实委派)
|
||
- ✅ `MuseContentWorkOwnerFacade`(content→ai)/ `ContentKnowledgeWorkOwnerFacade`(content→knowledge):@Primary 真实委派 content-api,**缺口已闭**(B2 勘察曾误判为未做)。
|
||
- ⏸ `MetaImpactFacade`(meta 发布链,**重新判定:缺特征非接线,降优先级**):现仅 `UnavailableMetaImpactFacade` 抛 `META_EXTERNAL_OWNER_UNAVAILABLE`,阻断 publish/activate/rollback/deprecate。**2026-06-14 勘察发现**:content/ai/knowledge DAL **均未持久化 schemaKey 用量引用**(content 的 "MetaSchema 版本" 仅在请求/响应 VO 作传参,非存储的"作品 X 用 schema Y"关系),无独立 export 模块。故无数据可真实计数,`Unavailable` 抛错实为**诚实 fail-closed**(拒绝伪造)。真实化 = 先建"meta-schema 用量投影"数据模型(各 owner 新表 + 写时落库 + 计数 API),是多模块**特征工程**而非 facade 接线;且 meta 治理属 admin 侧、用户价值低。**判定:置后,待用量投影建模专项**。service 层 `MetaSchemaImpactPreviewServiceImpl` 已就绪等真实 facade。**🔧 评审版设计已出(2026-06-17)**:[meta-schema用量投影-review](../agent-specs/2026-06-17-meta-schema用量投影-review.md)——grounding 证实根因(消费方仅 Content planning 存 `schema_version`、无 `schema_key`,Knowledge/AI 不存);推荐 **Pull(按需查询)+ 按 BC 拆贡献者端口**(订正:现 `MetaImpactFacade` 单接口返 5 维度=单实现者懂 5 BC 数据、违 BC 边界门,须拆为 meta-api 定义端口、各 owner 适配器),分阶段(P0 端口→P1 Content→P2+ 其余)。**待人类确认方向 + open items(尤维度归属/fail-closed 粒度)后**才进主 spec/执行版。
|
||
- ✅ `MarketAccountProjectionFacade`(account purchases/licenses/publish-records 读)——**2026-06-15 活体订正(反假绿)**:单体内由 market `MarketAccountProjectionProvider`(@Service,本身 implements MarketAccountProjectionFacade、对 purchase/license/publish **放行**)**跨模块提供**,`@ConditionalOnMissingBean` 使其压过 member 的 `Unavailable` 兜底(后者仅 member-alone 才用)。**这三端在单体本就可用**——curl 真返投影:purchase(活体市场资产·测试/completed)、license(installed)、**publish-records 5 条含 market-publish e2e 的 submitted/draft = market→account 端到端**。原"21 端 `*_UNAVAILABLE`"是静态误判(同 handoff 被推翻判定类)。单体内真正 fail-closed 的 account 端 = export/download(`AccountFileServiceFacade`)+ new-api recheck(`NewApiAccountFacade`),均**正确 fail-closed**(未配置外部服务:对象存储/New-API),非接线缺口。**结论:单体内无可真实化的 account facade 接线缺口**(member-local 真实 facade 仅 microservices 部署需要,范围外;本轮曾试做 `RealMarketAccountProjectionFacade`,翻转测试证实单体 no-op 后已回退)。
|
||
- ⬜ `AccountAttributionSourceFacade`(account 归因,**中**):属"源传播事件驱动"副路径(同下条 source-owner),不阻核心读旅程;各 owner BC 出归因出站 API 后接通。
|
||
- ⬜ 4× `Unavailable*SourceOwnerFacade`(AI←Account/Meta/Market/Knowledge 源属主校验,**中**):返回 `owner_missing`。属"源传播事件驱动"副路径,不阻 MVP#1 核心切片;各 owner BC 出 source-owner 出站 API。
|
||
- ⏸ 正确 fail-closed(非缺口):`UnavailableNewApiAccountFacade`/`UnavailableAccountFileServiceFacade`/`UnavailableSecurityToolGrantApprovalFacade`——依赖未配置的外部服务(New-API/对象存储/治理审批),保持 fail-closed。
|
||
|
||
### B. 验收债:86 个 needs_verification operation(✅ **已清零 → 233/233 completed**;门禁口径→真实证据)
|
||
- ✅ **验收债真实 IT 战役(2026-06-15 起,goal=验收债·真实 IT)**。原 needs_verification(台账 `docs/superpowers/reports/p1r-api-coverage.json`)= **content 37 / market 28 / account 21 = 86**;截至 2026-06-17 已全部补齐真实 PG 证据,并按用户批准翻为 completed。当前 coverage summary=**233 completed / 0 needs_verification / 0 incomplete / 0 blocked**。范式:`P1rContentCoreCompletedApprovalIT` / 本批新 IT;跑法见 §四(`_test` 库 + argLine + `-DreuseForks=false`)。
|
||
- **批1 ✅ 已交付(content work/chapter/block 生命周期 11 op)**:`P1rContentWorkLifecycleCompletedApprovalIT`(commit 2499c24,1/1 绿 mini-infra PG,独立复跑+逐 assert 反假绿复核)覆盖 createWork/updateWork/deleteWork、createChapter/updateChapter/deleteChapter/reorderChapters、createBlock/deleteBlock/mergeBlocks/splitBlock;每 op 断言 HTTP+真实 muse_content_* 持久化事实 + command_log。产出=Codex 起草 + Opus fork 落地纠偏双代理。**证据已人工批准并翻 completed**(已按人工批准加入 `P1rApiCoverageReportTest` 批准集合并同步台账 completionStatus)。
|
||
- **批2 ✅ 已交付(market 发布生产侧 5 op,2026-06-16)**:`P1rMarketPublishProducerCompletedApprovalIT`(真实 PG `muse_p1r_market_publish_test`,3/3 绿)覆盖 savePublishDraft/runPublishCheck/submitPublishRequest/withdrawPublishRequest/listMyPublishRecords;断言 HTTP + publish_draft/check/request/review_event/market_command/market_account_projection + Account 投影端口调用 + 失败检查不可提交。测试内仅对专属 `_test` 库做缺库自动创建,不放宽 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批3 ✅ 已交付(account 市场记录读端 3 op,2026-06-16)**:`P1rAccountMarketRecordsCompletedApprovalIT`(真实 PG `muse_p1r_account_market_records_test`,3/3 绿)覆盖 appListPurchases/appListLicenses/appListPublishRecords;种真实 `muse_account_record_projection` + `member_user` fixture,经真实 `/app-api/muse/account/*` 读取,断言租户/owner 隔离、状态归一、外部订单脱敏、非法输入 fail-closed、读端 no-write。Market 投影可用性由真实 `MarketAccountProjectionProvider` 判定,读端仍只读 Account 投影表。**证据已人工批准并翻 completed**。
|
||
- **批4 ✅ 已交付(market 管理端申诉 3 op,2026-06-16)**:`P1rMarketAdminAppealCompletedApprovalIT`(真实 PG `muse_p1r_market_admin_appeal_test`,6/6 绿)覆盖 adminListAppeals/adminGetAppeal/adminResolveAppeal;经真实 `/admin-api/muse/market/appeals/**` + Spring method security,断言列表/详情 no-write、租户隔离、RBAC/API version fail-closed、resolve 写 appeal 状态 + resolved event + completed command、幂等回放、expectedStatus 冲突事务回滚。测试内使用 latest schema(V23+),保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批5 ✅ 已交付(market 管理端发布审核 3 op,2026-06-16)**:`P1rMarketAdminPublishReviewCompletedApprovalIT`(真实 PG `muse_p1r_market_admin_review_test`,6/6 绿)覆盖 adminListPublishRequests/adminApprovePublishRequest/adminRejectPublishRequest;经真实 `/admin-api/muse/market/publish-requests/**` + Spring method security,断言列表 no-write、租户隔离、RBAC/API version fail-closed、approve 真实消费 submitted/check 证据并物化/上架 Market asset+version、reject 写 needs_supplement 事件与投影、completed command 幂等回放、expectedStatus/validationResult 冲突事务回滚。测试内使用 latest schema(V23+),保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批6 ✅ 已交付(market 生产者申诉写路 3 op,2026-06-16)**:`P1rMarketProducerAppealCompletedApprovalIT`(真实 PG `muse_p1r_market_producer_appeal_test`,7/7 绿,独立复跑两次均绿)覆盖 submitAppeal/supplementAppeal/withdrawAppeal;经真实 `/app-api/muse/marketplace/appeals/**`(app 侧无 method security,鉴权靠登录态 + 服务层 owner 隔离),断言:submit 走 review_rejection 关联(自有资产 + 7 天内被拒发布申请)写 appeal(pending,rev1)+ submitted event(snapshot 含 appealType/originalResult=rejected/source)+ completed command;supplement 脱敏只存摘要(密钥 `sk-*`/`token=*`→`[REDACTED]`、不留明文)+ supplementing→reviewing 状态 CAS(rev→2)+ 材料落库 + 幂等回放;withdraw →closed(rev→2)+ resolution 记录撤回理由 + withdrawn event(expectedStatus/previousStatus);三写均命令回放幂等;fail-closed(非属主→`无权访问`/无关联→`关联事实不存在`/超期→`期限已过`/资产不存在/越权他人→`申诉不存在`/未确认隐私→VO 拦截)全程 0 写、0 command 预占;状态冲突 + expectedStatus 冲突均**事务回滚**(reserveCommand 预占=0、rev 不动);API version + 无登录守卫。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫;迁移到 latest schema(V23+)。**证据已人工批准并翻 completed**。
|
||
- **批7 ✅ 已交付(account 配额请求 3 op,2026-06-16)**:`P1rAccountQuotaRequestCompletedApprovalIT`(真实 PG `muse_p1r_account_quota_request_test`,5/5 绿,独立复跑两次均绿)覆盖 appCreateQuotaRequest/appGetQuotaRequest/adminCreateQuotaRequest;经真实 `/app-api/muse/account/quota-requests` 与 `/admin-api/muse/account/users/{userId}/quota-requests`(member 模块租户行拦截器 + member_user fixture + admin `@PreAuthorize` method security),断言:create 入队写 quota_request(queued)+ pending_attribution 外部调用占位 + completed command(app:actor=owner=登录用户、amount=0;admin:actor=操作者、owner=目标用户、amount=targetQuota.limit)、命令幂等回放(idempotent_hit 不写第二条)、相同 commandId 不同请求 hash→`ACCOUNT_COMMAND_ID_CONFLICT` 事务回滚;get 按 owner+tenant 隔离返回归一化状态、纯读 no-write;fail-closed(类型白名单 BAD_REQUEST/API version/缺用户 `ACCOUNT_USER_NOT_EXISTS`/越权 owner/not-found/RBAC deny)全程 0 写、0 command 预占;配额请求链路不写 Account 审计(audit/outbox 桩抛错反假绿)。10 条负路全部经真实 GlobalExceptionHandler 实测命中(9 serviceException + 1 accessDenied)。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批8 ✅ 已交付(account 用量与外部调用可观测读端 3 op,2026-06-16)**:`P1rAccountUsageObservabilityCompletedApprovalIT`(真实 PG `muse_p1r_account_usage_observability_test`,4/4 绿,独立复跑两次均绿)覆盖 getAppUsage/appGetIntegrationCallByCorrelation/adminGetIntegrationCallByCorrelation;经真实 `/app-api/muse/account/usage`、`/app-api/muse/account/integration-calls/by-correlation/{id}` 与 `/admin-api/muse/account/integration-calls/by-correlation/{id}`(member 模块租户行拦截器 + member_user fixture + admin `@PreAuthorize` method security),断言:getAppUsage 按 owner 聚合(token 输入 160/输出 235 求和、pending 计数 1、anomaly 计数 1、byModel MiniMaxM2=380/GLM=15、byAttribution work+agent)且跨用户隔离(他人 9999 不计入)、period 规范化(month)与白名单(yearly→BAD_REQUEST);app 侧外部调用读 owner 守卫(自有→归一化 pending_attribution/quota_request/retryGroup、越权→`ACCOUNT_RESOURCE_FORBIDDEN`),admin 侧无 owner 限制(可读任意用户、status/requestType 归一化、RBAC=`muse:account:query`);三 op 纯读全程 no-write(member_user/usage_record/integration_call/command/audit 快照前后一致),fail-closed(缺用户 `ACCOUNT_USER_NOT_EXISTS`/not-found `ACCOUNT_INTEGRATION_CALL_NOT_EXISTS`/API version/RBAC deny FORBIDDEN)。控制器附带依赖(权益/绑定/配额/归因 service)用抛错 mock 反假绿越界。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批9 ✅ 已交付(account New-API 绑定簇 3 op,2026-06-16)**:`P1rAccountNewApiBindingClusterCompletedApprovalIT`(真实 PG `muse_p1r_account_newapi_binding_test`,4/4 绿,独立复跑两次均绿)覆盖 getAppNewApiBinding/adminListNewApiBindings/appRecheckNewApiBinding;经真实 `/app-api/muse/account/new-api-binding`、`/admin-api/muse/account/new-api-bindings`、`/app-api/muse/account/new-api-binding/recheck`(member 模块租户行拦截器 + member_user fixture + admin `@PreAuthorize` method security),断言:getAppNewApiBinding 按 owner 读绑定摘要 + 存储态归一(active→bound、无绑定→unbound 且不可重验)、纯读 no-write;adminListNewApiBindings 以账户用户为分页主表(无筛选按 id 倒序返 bound/unbound/sync_failed 三态 + syncErrorMessage)、bindingStatus 走 EXISTS/NOT EXISTS 筛选、非法状态 BAD_REQUEST、RBAC=`muse:account:query` fail-closed、纯读 no-write;appRecheckNewApiBinding 在单体 New-API facade(`UnavailableNewApiAccountFacade`)不可用时**正确 fail-closed**——业务 `@Transactional` 回滚命令预占(0 残留),失败外部调用经 `REQUIRES_NEW` 独立落库一条 `unavailable`(error_code 可排障),binding 不被改写,客户端收 `ACCOUNT_NEW_API_UNAVAILABLE`;binding 不存在/缺用户/API version 三守卫全程 0 写。控制器/服务附带依赖(quota/usage/audit service)用抛错 mock 反假绿越界。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批10 ✅ 已交付(account 导出/下载簇 3 op,2026-06-16)**:`P1rAccountExportDownloadClusterCompletedApprovalIT`(真实 PG `muse_p1r_account_export_test`,4/4 绿,独立复跑两次均绿)覆盖 appCreateExportTask/appGetExportTask/appDownloadExport;经真实 `/app-api/muse/account/export-tasks`、`/app-api/muse/account/export-tasks/{taskId}`、`/app-api/muse/account/downloads/{credentialId}`(member 模块租户行拦截器 + member_user fixture),断言:create 在 FileService(`UnavailableAccountFileServiceFacade`,单体默认)未接入时按合同把非敏感导出(profile)落库为 queued 任务 + 命令 + 成功审计、绝不伪造 completed/fileRef/下载凭证、不写安全事件,相同 commandId 幂等回放(idempotent_hit 不写第二条),敏感类型(usage)缺 step-up→BAD_REQUEST 回滚、非法 exportType/缺用户/API version 均 fail-closed;get 按 owner 读任务状态归一、跨 owner not found、纯读 no-write;download 校验下载凭证(无效→`ACCOUNT_DOWNLOAD_CREDENTIAL_INVALID`),凭证可用但 FileService 不可用时**正确 fail-closed**——`@Transactional` 回滚一次性消费(凭证 consumed_at 仍空可重试)+ 不写下载审计,客户端收 `ACCOUNT_FILE_SERVICE_UNAVAILABLE`。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批11 ✅ 已交付(account 管理端只读补全 2 op,2026-06-17)**:`P1rAccountAdminReadsCompletedApprovalIT`(真实 PG `muse_p1r_account_admin_reads_test`,3/3 绿,独立复跑两次均绿)覆盖 adminListUsageRecords/adminGetCallAttributionJob;经真实 `/admin-api/muse/account/usage-records` 与 `/admin-api/muse/account/call-attribution-jobs/{jobId}`(member 模块租户行拦截器 + member_user fixture + admin `@PreAuthorize` method security),断言:adminListUsageRecords 以账户用户为分页主表在库内聚合(token 输入 150/输出 230/合计 380 求和、pending 计数 1/failed 0、attributionStatus=pending)、非法 period→BAD_REQUEST;adminGetCallAttributionJob 按 jobId 读 job+items 并归一状态(completed)+ 分桶计数(attributed 1/failed 1/pending 0)、not-found→`ACCOUNT_INTEGRATION_CALL_NOT_EXISTS`;两 op 均 RBAC=`muse:account:query` fail-closed、API version 守卫、纯读 no-write(命令/审计/外部调用表保持为空)。归因写路外部来源 facade 用抛错 mock 反假绿越界。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批12 ✅ 已交付(account 管理端写路收尾 2 op,2026-06-17)**:`P1rAccountAdminWritesCompletedApprovalIT`(真实 PG `muse_p1r_account_admin_writes_test`,3/3 绿,独立复跑两次均绿)覆盖 adminCreateNewApiBinding/adminCreateCallAttributionJob;经真实 `/admin-api/muse/account/users/{userId}/new-api-binding` 与 `/admin-api/muse/account/call-attribution-jobs`(member 模块租户行拦截器 + member_user fixture + admin `@PreAuthorize` method security),断言:adminCreateNewApiBinding 在单体 New-API facade(`UnavailableNewApiAccountFacade`)不可用时**正确 fail-closed**——业务 `@Transactional` 回滚命令预占(0 残留)+ 不写 binding,失败外部调用经 `REQUIRES_NEW` 独立落库一条 `unavailable`,客户端收 `ACCOUNT_NEW_API_UNAVAILABLE`,目标用户不存在/RBAC(`muse:account:new-api:manage`)/API version 守卫 0 写;adminCreateCallAttributionJob 基于已存在 correlationId 外部调用建立 queued 归因 job + 命令(items 暂空)、命令幂等回放(idempotent_hit 不写第二条)、callIds 白名单未命中 BAD_REQUEST、expectedCallRevision 版本冲突 `ACCOUNT_VERSION_CONFLICT`、缺调用记录 `ACCOUNT_INTEGRATION_CALL_NOT_EXISTS`、RBAC(`muse:account:attribution:manage`)/API version fail-closed,失败路径全程 0 写。命令走真实实现,归因来源/审计/配额/用量附带依赖用抛错 mock 反假绿越界。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批13 ✅ 已交付(account 安全事件确认 1 op,2026-06-17)**:`P1rAccountSecurityEventAckCompletedApprovalIT`(真实 PG `muse_p1r_account_security_ack_test`,2/2 绿,独立复跑两次均绿)覆盖 appAcknowledgeSecurityEvent;经真实 `/app-api/muse/account/security-events/{eventId}/acknowledge`(member 模块租户行拦截器 + member_user fixture),断言:属主确认按 owner 校验事件归属、向追加表 muse_account_security_event_ack 追加处理轨迹 + 基础事件 acknowledged 置真 + 命令 + 成功审计,相同 commandId 幂等回放(不追加第二条轨迹);非法 action→BAD_REQUEST、跨 owner→NOT_FOUND(owner 隔离不泄露)、非数字 eventId→NOT_FOUND、缺用户→`ACCOUNT_USER_NOT_EXISTS`、API version 守卫,全程 fail-closed 且 0 写。命令/审计走真实实现,无外部依赖。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批14 ✅ 已交付(account 管理端购买记录读 1 op,account 验收债清零,2026-06-17)**:`P1rAccountAdminPurchaseRecordsCompletedApprovalIT`(真实 PG `muse_p1r_account_admin_purchase_test`,2/2 绿,独立复跑两次均绿)覆盖 adminListPurchaseRecords;经真实 `/admin-api/muse/account/purchase-records`(跨模块:`muse.info.base-package=cn.iocoder.muse.module`,单体内 market 的 `MarketAccountProjectionProvider` 真实判定 purchase 投影可用,读端只读 Account 自有投影表 muse_account_record_projection;Account 投影写端口用抛错 stub 越界反假绿),断言:无 userId→跨用户返回全部购买投影、userId 过滤→仅该用户且状态归一(source_status→admin status)+ 资产信息从投影 title/snapshot 回填(assetType/assetName)、userId+status=completed 命中、status=refunded 该用户无返回空、非法 status→BAD_REQUEST、API version 守卫→`ACCOUNT_API_VERSION_UNSUPPORTED`、RBAC(`muse:account:query`)deny→FORBIDDEN,全程纯读 no-write(member_user + 投影表 row_to_json 快照零变更)。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批15 ✅ 已交付(market 管理端资产治理读 2 op,2026-06-17)**:`P1rMarketAdminAssetReadsCompletedApprovalIT`(真实 PG `muse_p1r_market_admin_asset_test`,2/2 绿,独立复跑两次均绿)覆盖 adminListMarketAssets/adminGetMarketAsset;经真实 `/admin-api/muse/market/assets`(market 模块整组治理 mapper + `MarketCommandServiceImpl` + `MarketEventPublishOutboxServiceImpl`,base-package=cn.iocoder.muse.module,admin `@PreAuthorize` method security),断言:列表按 tenant 隔离 + assetType/listingStatus/publisherId 过滤(listingStatus 的 not_listed↔draft 由服务端 toInternalListingStatus/normalizeListingStatus 双向归一)、publisherName/version(无当前版本→unknown)回填、关联计数(安装/绑定/申诉=0,关联表空);详情按 tenant 隔离返回资产快照 + 授权/安装/绑定/受影响任务计数全 0 + 版本/治理历史/申诉空集合;缺资产/跨租户→`MARKET_ASSET_NOT_EXISTS`、非法 API version→`MARKET_API_VERSION_UNSUPPORTED`、RBAC(`muse:market:asset:query`)deny→FORBIDDEN,两 op 全程纯读 no-write(资产/命令/治理/来源状态/事件 outbox 表 row_to_json 快照零变更)。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批16 ✅ 已交付(market 管理端资产治理写 3 op,2026-06-17)**:`P1rMarketGovernanceWriteCompletedApprovalIT`(真实 PG `muse_p1r_market_governance_test`,4/4 绿,独立复跑两次均绿)覆盖 adminPreviewGovernanceImpact/adminDelistAsset/adminRecallAsset;经真实 `/admin-api/muse/market/assets/{id}/governance-impact|delist|recall`(同 批15 配置 + 治理 `@PreAuthorize` method security),断言治理写生命周期:影响预览写 ready 预览 + 预览影响 + completed 命令并返回影响计数/通知范围(关联表空→计数全 0)→ 凭预览下架(listed→delisted 的 expectedStatus CAS + applied 治理动作 + 治理影响 + 事件发布 outbox + completed 命令)→ 凭预览召回(listed→recalled + 目标 owner 传播 **fail-closed**:如实记录 source_status_event recalled/recorded/`TARGET_OWNER_UNAVAILABLE` 而非伪造成功);命令幂等回放命中 completed 不写第二条 fact;fail-closed 全覆盖:合同枚举 VO `@Pattern`→BAD_REQUEST(service `requireAllowed` 为防御纵深)、缺/非 ready 预览→`MARKET_GOVERNANCE_PREVIEW_REQUIRED`、CAS 阻断→`MARKET_ASSET_GOVERNANCE_BLOCKED`(命令预占随 `@Transactional` 回滚、0 残留)、缺资产→`MARKET_ASSET_NOT_EXISTS`、API version、RBAC deny→FORBIDDEN,失败路径全程 0 写。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批17 ✅ 已交付(marketplace 发现读 3 op,2026-06-17)**:`P1rMarketplaceDiscoveryReadsCompletedApprovalIT`(真实 PG `muse_p1r_marketplace_discovery_test`,4/4 绿,独立复跑两次均绿)覆盖 listMarketplaceAssets/listMarketplaceRecommendations/getGovernanceImpact;经真实 `/app-api/muse/marketplace/assets|recommendations|assets/{id}/governance-impact`(MarketAssetQueryServiceImpl + 收藏/命令依赖,base-package=cn.iocoder.muse.module),断言:列表按 App 可见性(listed 公开;draft 等非公开仅 publisher 自见)+ assetType 过滤分页 + 卡片字段回填(publisherName/version=unknown/isFavorite=false/isAcquired=false/isInstalled=false);fallback 推荐返回可见资产卡片 + 推荐理由;治理影响读按 publisher/受影响者门禁(publisher 自见返回治理结果摘要 + 空受影响列表;非属主且无关联授权/安装/绑定→fail-closed `MARKET_RESOURCE_FORBIDDEN`,杜绝借治理接口探测非公开资产);缺资产→`MARKET_ASSET_NOT_EXISTS`、非法 API version→`MARKET_API_VERSION_UNSUPPORTED`,三 op 全程纯读 no-write(资产/收藏/命令/治理表 row_to_json 快照零变更)。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批18 ✅ 已交付(market 采纳链 2 op,2026-06-17)**:`P1rMarketLicenseInstallCompletedApprovalIT`(真实 PG `muse_p1r_market_license_install_test`,3/3 绿,独立复跑两次均绿)覆盖 purchaseAsset/installMarketplaceAsset;经真实 `/app-api/muse/marketplace/assets/{id}/purchase|install`(MarketLicenseServiceImpl + MarketInstallServiceImpl + MarketCommandServiceImpl + MarketAccountProjectionProvider/Outbox,base-package=cn.iocoder.muse.module),断言:购买写授权快照 + 购买事实 + completed 命令并把 purchase + license 两条 Account 投影经写端口跨 BC 同步(RecordingAccountProjectionApi 真实捕获、读端绝不反写反假绿);安装要求已购 active 授权(无授权→`MARKET_LICENSE_NOT_EXISTS`)、仅 agent/kb 可安装(作品已购仍→`MARKET_INSTALL_NOT_BINDABLE` 且安装路径 0 写)、写 installed 安装记录 + completed 命令 + license 投影;purchase/install 命令幂等回放命中 completed 不写第二份事实;未上架(属主可见非 listed)→`MARKET_ASSET_NOT_LISTED`、缺资产→`MARKET_ASSET_NOT_EXISTS`、授权类型不符→`MARKET_LICENSE_NOT_PURCHASABLE`、API version→`MARKET_API_VERSION_UNSUPPORTED`,失败路径全程 0 写。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批19 ✅ 已交付(market handoff 簇 4 op,market 验收债清零,2026-06-17)**:`P1rMarketHandoffClusterCompletedApprovalIT`(真实 PG `muse_p1r_market_handoff_test`,3/3 绿,独立复跑两次均绿)覆盖 createBindPrecheck/createMarketplaceHandoff/getHandoffStatus/cancelHandoff;经真实 `/app-api/muse/marketplace/assets/{id}/bind-precheck`、`/handoffs`、`/handoffs/{token}`、`/handoffs/{token}/cancel`(MarketHandoffServiceImpl + MarketCommandServiceImpl + LocalMarketTargetOwnerFacade,base-package=cn.iocoder.muse.module),断言端到端链:bind-precheck 基于已购 active 授权快照生成来源侧授权摘要(handoffReady + sourceStatus=available + compatibilityResult=source_summary_ready + actionPolicy installPolicy/bindPolicy=allowed,落 active 摘要 + completed 命令)→ 凭摘要创建一次性 handoff(落 pending token 事件 + completed 命令,**token 明文不入库、只存 sha256 hash,事件快照不含明文 token**,targetPage 由 LocalMarketTargetOwnerFacade 白名单模板生成)→ 凭 token 只读回显 pending(纯读 no-write)→ 按 expectedStatus CAS 取消(pending→cancelled + completed_at + completed 命令);bind/handoff 相同 commandId 回放命中 completed 返回与首呼一致结果(handoff 回放确定性 token 一致)不双写、cancel 终态后再次取消被取消性守卫拒绝(`MARKET_HANDOFF_NOT_CANCELLABLE`,该守卫先于 replay 短路、故顺序回放观察到的是终态守卫而非幂等成功)且 0 写;fail-closed 全覆盖:非法 API version→`MARKET_API_VERSION_UNSUPPORTED`、缺资产→`MARKET_ASSET_NOT_EXISTS`、无活跃授权→`MARKET_LICENSE_NOT_EXISTS`(授权≠可达不变式)、目标 owner 白名单外→`MARKET_TARGET_OWNER_UNAVAILABLE`(本地目标页边界 fail-closed,buildTargetPage 先于预占命令抛错)、跨属主 token 读取/取消→`MARKET_RESOURCE_FORBIDDEN`(token 属主隔离)、取消 CAS 期望态不匹配→`MARKET_HANDOFF_NOT_CANCELLABLE`(reserveCommand 为 `Propagation.MANDATORY`,预占命令随 `@Transactional` 回滚 0 残留),失败路径全程 0 写。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫。**证据已人工批准并翻 completed**。
|
||
- **批20 ✅ 已交付(content planning candidate 簇 5 op fail-closed,2026-06-17)**:`P1rContentPlanningCandidateClusterCompletedApprovalIT`(真实 PG `muse_p1r_content_planning_candidate_test`,3/3 绿,独立复跑两次均绿)覆盖 createPlanningCandidate/listPlanningCandidates/getPlanningCandidate/confirmPlanningCandidate/discardPlanningCandidate;经真实 `/app-api/muse/works/{id}/planning/candidates*`(AppContentPlanningController + ContentPlanningServiceImpl + ContentCommandServiceImpl + ContentAuditServiceImpl + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。规划候选生成/运行事实/状态投影归 **AI owner**,单体内 `ContentPlanningCandidateFacade` 仅 fail-closed 默认实现(全 default = unavailable,等价生产 `UnavailableContentPlanningCandidateFacade` 的 `@ConditionalOnMissingBean` 兜底)。断言:AI owner 不可用时五 op 全部 fail-closed→`CONTENT_EXTERNAL_OWNER_UNAVAILABLE`,绝不伪造 queued/processing 任务、绝不在 Content 侧伪造 discarded;尤其 **confirmPlanningCandidate(候选进正文唯一合法入口)拒绝写正式 planning section**(无候选投影即不落 canonical),create/confirm/discard 写 op 已预占命令随 `@Transactional` 回滚 0 残留,五 op 全程 0 写(无 planning section / 无命令 / 无事件 outbox);owner/存在性守卫先于外部调用——跨属主作品→`CONTENT_FORBIDDEN`、缺作品→`CONTENT_NOT_FOUND` 且 0 写(杜绝借候选接口探测他人作品)。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫;迁移 V1-V21。**证据已人工批准并翻 completed**。
|
||
- **批21 ✅ 已交付(content meta-projection 簇 3 op fail-closed,2026-06-17)**:`P1rContentMetaProjectionClusterCompletedApprovalIT`(真实 PG `muse_p1r_content_meta_projection_test`,3/3 绿,独立复跑两次均绿)覆盖 listMetaProjections/getMetaProjection/validateDynamicFields;经真实 `/app-api/muse/works/{id}/meta-projections`、`/meta-projections/{key}`、`/dynamic-fields/validate`(AppContentMetaProjectionController + ContentMetaProjectionServiceImpl + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。MetaSchema 解释/Meta 投影/动态字段校验规则均归 **Meta owner**,单体内 `ContentMetaFacade` 仅 fail-closed 默认实现(全 default = unavailable,`@ConditionalOnMissingBean` 兜底)。断言:Meta owner 不可用时三 op 全部 fail-closed→`CONTENT_EXTERNAL_OWNER_UNAVAILABLE`,绝不在 Content 侧伪造投影或复制 MetaSchema 规则,三 op 纯读全程 0 写;守卫先于外部调用——非法 API version→`CONTENT_API_VERSION_UNSUPPORTED`、跨属主作品→`CONTENT_FORBIDDEN`、缺作品→`CONTENT_NOT_FOUND` 且 0 写(validateDynamicFields 的 `fields` 经 `@NotEmpty`+元素 `@NotBlank`/`@NotNull` 在入服务前 @Valid 拦截)。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫;迁移 V1-V21。**证据已人工批准并翻 completed**。
|
||
- **批22 ✅ 已交付(content style-check 簇 2 op fail-closed,2026-06-17)**:`P1rContentStyleCheckClusterCompletedApprovalIT`(真实 PG `muse_p1r_content_style_check_test`,3/3 绿,独立复跑两次均绿)覆盖 createStyleCheck/getStyleCheckResult;经真实 `/app-api/muse/works/{id}/planning/style-checks` 与 `/style-checks/{jobId}`(AppContentPlanningController + ContentPlanningServiceImpl + ContentCommandServiceImpl + ContentAuditServiceImpl + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。风格检查任务生成与结果归 **AI owner**,单体内 `ContentStyleCheckFacade` 仅 fail-closed 默认实现(全 default = unavailable,`@ConditionalOnMissingBean` 兜底)。断言:AI owner 不可用时两 op 全部 fail-closed→`CONTENT_EXTERNAL_OWNER_UNAVAILABLE`,绝不伪造 queued 任务或结果;createStyleCheck 写 op 已预占命令随 `@Transactional` 回滚 0 残留,两 op 全程 0 写;owner/存在性守卫先于外部调用——跨属主作品→`CONTENT_FORBIDDEN`、缺作品→`CONTENT_NOT_FOUND` 且 0 写。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫;迁移 V1-V21。**证据已人工批准并翻 completed**。
|
||
- **批23 ✅ 已交付(content chapter-parse-result 决策 2 op fail-closed,2026-06-17)**:`P1rContentChapterParseResultDecisionCompletedApprovalIT`(真实 PG `muse_p1r_content_import_parse_test`,3/3 绿,独立复跑两次均绿)覆盖 confirmChapterParseResult/rejectChapterParseResult;经真实 `/app-api/muse/chapter-parse-results/{resultId}/confirm`、`/reject`(AppContentImportParseController + ContentImportParseServiceImpl + ContentCommandServiceImpl + ContentAuditServiceImpl + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。AI 解析任务/章节结果投影/知识草稿生成均归 **AI owner**;单体内 `ContentParseJobFacade`/`ContentKnowledgeDraftFacade`/`ContentFileFacade` 仅 fail-closed 默认实现(全 default = unavailable,`@ConditionalOnMissingBean` 兜底)。断言:AI owner 不可用时两 op 全部 fail-closed→`CONTENT_EXTERNAL_OWNER_UNAVAILABLE`(章节结果投影在 `requireChapterResultProjection` 处即不可用,故绝不生成知识草稿、绝不记录确认/拒绝决策);两 op 均写路,已预占命令随 `@Transactional` 回滚 0 残留,全程 0 写;非法 API version→`CONTENT_API_VERSION_UNSUPPORTED` 守卫先于服务体且 0 写。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫;迁移 V1-V21。**证据已人工批准并翻 completed**。
|
||
- **批24 ✅ 已交付(content parse-job 生命周期 4 op fail-closed,2026-06-17)**:`P1rContentParseJobLifecycleCompletedApprovalIT`(真实 PG `muse_p1r_content_parse_job_test`,3/3 绿,独立复跑两次均绿)覆盖 getParseJob/listParseJobChapters/retryParseJob/batchConfirmChapters;经真实 `/app-api/muse/parse-jobs/{jobId}`、`/chapters`、`/retry`、`/chapters/batch-confirm`(同 批23 配置:AppContentImportParseController + ContentImportParseServiceImpl + ContentCommandServiceImpl + ContentAuditServiceImpl + 3 外部 owner facade(`ContentParseJobFacade`/`ContentKnowledgeDraftFacade`/`ContentFileFacade`)默认 unavailable + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。断言:AI 解析 owner 不可用时四 op 全部 fail-closed→`CONTENT_EXTERNAL_OWNER_UNAVAILABLE`(解析任务投影在 `requireParseJobProjection` 处即不可用,故绝不伪造任务/章节/重试/批量确认结果);两写 op(retry/batchConfirm)已预占命令随 `@Transactional` 回滚 0 残留,四 op 全程 0 写;非法 API version→`CONTENT_API_VERSION_UNSUPPORTED` 守卫先于服务体且 0 写。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫;迁移 V1-V21。**证据已人工批准并翻 completed**。
|
||
- **批25 ✅ 已交付(content import-task 簇 2 op:真实只读 + fail-closed,2026-06-17)**:`P1rContentImportTaskCompletedApprovalIT`(真实 PG `muse_p1r_content_import_task_test`,3/3 绿,独立复跑两次均绿)覆盖 getImportTask/createImportTask;经真实 `/app-api/muse/import-tasks/{taskId}`、`/works/{id}/import-tasks`(同 批23/24 配置,base-package=cn.iocoder.muse.module.content)。**getImportTask 是 Content 自有事实 `muse_content_import_task` 的真实持久化只读**——种真实任务行后经 HTTP 读回库内字段(id/workId/status/fileName/fileSize/format/scanStatus/progress 全部断言、纯读 no-write),并验缺任务→`CONTENT_NOT_FOUND`、跨属主→`CONTENT_FORBIDDEN`(owner 隔离不泄露);**createImportTask 依赖 FileService owner**,单体内 `ContentFileFacade` 仅 fail-closed 默认实现,故 FileService 不可用时 fail-closed→`CONTENT_EXTERNAL_OWNER_UNAVAILABLE` 绝不伪造已可用导入任务、不新增任务行、预占命令随 `@Transactional` 回滚,非法格式→`CONTENT_INVALID_STATUS_TRANSITION`(先于命令预占)、非法 API version→`CONTENT_API_VERSION_UNSUPPORTED` 守卫,失败路径 0 写。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫;迁移 V1-V21。**证据已人工批准并翻 completed**。
|
||
- **批26 ✅ 已交付(content export-task 簇 4 op:真实只读 + FileService fail-closed,2026-06-17)**:`P1rContentExportTaskCompletedApprovalIT`(真实 PG `muse_p1r_content_export_task_test`,3/3 绿,独立复跑)覆盖 getExportTask/exportWork/createExportTask/downloadExportPackage;经真实 `/app-api/muse/export-tasks/{taskId}`、`/works/{id}/export`、`/works/{id}/export-tasks`、`/downloads/{credentialId}`(AppContentExportController + ContentExportServiceImpl + ContentCommandServiceImpl + ContentAuditServiceImpl + `ContentFileFacade` 默认 unavailable + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。**getExportTask 是 Content 自有事实 `muse_content_export_task` 的真实持久化只读**——种真实导出任务行后经 HTTP 读回 id/workId/format/status/progress/downloadCredentialId/downloadExpiresAt/completedAt/sourceSnapshot,纯读 no-write,并验缺任务→`CONTENT_NOT_FOUND`、跨属主→`CONTENT_FORBIDDEN`;**exportWork/createExportTask/downloadExportPackage 依赖 FileService owner**,FileService 不可用时 fail-closed→`CONTENT_EXTERNAL_OWNER_UNAVAILABLE`,绝不伪造导出包/下载字节,非法格式→`CONTENT_INVALID_STATUS_TRANSITION`、跨作品章节→`CONTENT_NOT_FOUND`、无效/未完成下载凭证→`CONTENT_DOWNLOAD_CREDENTIAL_INVALID`、非法 API version→`CONTENT_API_VERSION_UNSUPPORTED`,失败路径 0 写。顺手修正 `ContentExportServiceImpl` 事务边界:public `exportWork/createExportTask` 补 `@Transactional`,避免同类自调用导致内部事务注解失效;IT 用 command_log 0 残留断言实证 FileService fail-closed 后预占命令已回滚。测试内仅对专属 `_test` 库做缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫;迁移 V1-V21。**证据已人工批准并翻 completed**。
|
||
- **批27 ✅ 已交付(content 管理端导入/导出任务列表 2 op:真实只读,2026-06-17)**:`P1rContentAdminReadCompletedApprovalIT` 扩展(真实 PG `muse_p1r_content_admin_read_test`,6/6 绿)覆盖 adminListImportTasks/adminListExportTasks;经真实 `/admin-api/muse/content/import-tasks`、`/admin-api/muse/content/export-tasks`(AdminContentController + ContentAdminServiceImpl + Spring method security + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。两 op 均为 Content 自有事实 `muse_content_import_task`/`muse_content_export_task` 的管理端只读列表:种真实任务行后经 HTTP 读回分页 total/list、status/workId 筛选、workTitle 关联回填、ownerId/format/status/fileName/fileSize/completedAt 等字段;跨租户任务由 SQL tenant interceptor 隔离且响应不泄露跨租户标题/文件名/packageRef;RBAC deny→FORBIDDEN 且 0 写;非法 API version→`CONTENT_API_VERSION_UNSUPPORTED` 且先于服务体拒绝;全程 no-write 快照覆盖 work/chapter/block/governance/import/export/command/outbox。顺手把该老 admin-read IT 补齐为专属 `_test` 库缺库自动创建,保留 `_test`/密码环境变量/凭据 query 守卫;迁移 V1-V21。**证据已人工批准并翻 completed**。
|
||
- **批28 ✅ 已交付(content 最后 2 op:解析任务创建 fail-closed + AI 候选采纳真实写,2026-06-17)**:扩展 `P1rContentParseJobLifecycleCompletedApprovalIT` 覆盖 createParseJob;经真实 `POST /app-api/muse/works/{workId}/parse-jobs` 进入 AppContentImportParseController + ContentImportParseServiceImpl + ContentCommandServiceImpl + ContentAuditServiceImpl,种真实 `muse_content_work`/`muse_content_import_task` 后断言导入任务属主/作品关系/扫描状态守卫先于 AI owner 调用(跨属主→`CONTENT_FORBIDDEN`、跨作品→`CONTENT_NOT_FOUND`、扫描未通过→`CONTENT_INVALID_STATUS_TRANSITION`),AI 解析 owner 未接入时正确 fail-closed→`CONTENT_EXTERNAL_OWNER_UNAVAILABLE`,预占命令随事务回滚 0 残留,非法 API version 0 写。同步修正 `P1rContentMergeSuggestionIT` 老 harness 缺专属 `_test` 库自动创建的问题,复跑 mergeBlockSuggestion 强证据:真实 PG + 真实 `AiSuggestionMergeProjectionFacade` 读 `muse_ai_suggestion`,采纳后写 Canonical `muse_content_block` revision/content/word_count + source attribution + content outbox + completed command,并覆盖 revision 冲突、幂等回放、非 pending、审缺失负路。验证:`test-compile` 绿;`P1rContentMergeSuggestionIT` 单跑 5/5 绿;`P1rContentParseJobLifecycleCompletedApprovalIT,P1rContentMergeSuggestionIT` 合跑真实 PG `muse_p1r_content_batch28_test` **9/9 绿**。**证据已人工批准并翻 completed**。
|
||
- 剩余:content **0**(批20-28 合计补 planning candidate 5 + meta-projection 3 + style-check 2 + parse-result 决策 2 + parse-job 生命周期/创建 5 + import-task 2 + export-task 4 + 管理端任务列表 2 + mergeBlockSuggestion 1 = 26 op;其中 getImportTask/getExportTask/adminListImportTasks/adminListExportTasks 与 mergeBlockSuggestion 为真实持久化读/写强证据,余外部 owner(AI/Meta/解析/FileService)未接入路径均 fail-closed 且 0 脏写)+ market **0**(批15-19 补管理端资产治理读写 5 + marketplace 发现读 3 + 采纳链 purchase/install 2 + handoff 簇 4 = 14 op,叠加本战役前已补证的发布生产 5 + 管理端申诉 3 + 管理端发布审核 3 + 生产者申诉 3 = 14 op,合计 28 op 全补证 → market needs_verification 验收债清零,证据已人工批准并翻 completed)+ account **0**(adminListPurchaseRecords 已补证 → account needs_verification 验收债清零,批3/7-14 全部经真实 PG 证据、证据已人工批准并翻 completed)。**至此 content/market/account 三域 needs_verification 验收债均已补齐真实 PG 证据;coverage JSON completed 已按人工批准翻转,`P1rApiCoverageReportTest` 与 `P1r*RealApiGateTest` 批准口径已同步。**
|
||
- ✅ **P1r*IT 真实 PG 基线(2026-06-15,mini-infra PG)= 23/23 IT 类全绿**(99 用例 0F/0E;2 例 external-acceptance 因未设 `MUSE_P1R_EXTERNAL_ACCEPTANCE` 跳过)。`P1rKnowledgeFlywayMigrationIT` 版本断言由硬编码(V14→V21→V23 复发两次)改为 `MigrateResult` 动态自适应(commit 4d46d7a,Codex+Opus 双代理合并)。**完整跑法见 [.agents/knowledge §四](../../.agents/knowledge/external-deps-and-gotchas.md)**:`_test` 后缀隔离库 + `source infra.env`(密码仅 env)+ argLine(SOCKS 清 + p1r.flyway.url/user/locations)+ `-DreuseForks=false`(批量必加,避 Market IT 属性脱敏污染复用 fork)。
|
||
- 🔧 ai/平台预存红测试整改(CI 接电将暴露):`MuseAiTaskServiceTest` 桩缺失 11 例 NPE **✅ 已整改(补 eventPublishOutboxService/candidateReviewService 桩 + review lenient,40/40,2026-06-15)**;`QiniuSmsClientTest` 时区硬编码 **✅ 已整改(5/5,机器无关)**;`MuseAiEventPublishOutboxMapperTest` **✅ 真实 PG 实跑 5/5(mini-infra PG,harness=infra.env+argLine SOCKS 清;隔离 schema 自建自清)**。**ai/平台预存红三项全清。**
|
||
|
||
### C. 前端 muse-studio(B3,体量最大,最长的长板)
|
||
|
||
- ✅ **2026-06-15:整套 studio e2e 单次全绿 8/8**(chromium,MSW off 直连单体 48080)——accept-suggestion 正+负 / knowledge-confirm / live-read ×4(content·market·account·ai) / workspace 壳;MSW-off 已固化进 `playwright.config.ts` webServer `env`(CI 自起 vite 生效)+ `.env.local`(本地);`workspace.spec.ts` 原 mock 假绿(断言「星海迷途」,MSW 关后必红)**已改写为不依赖 mock 的活体壳冒烟**,消除最后一处 MSW 互斥红。下列各 ✅ 切片即构成此 8/8。**(套件此后随切片增长:live-read ×4→×6 增「购买/授权」「安全事件」深页 + market-publish ×3→×8 增上架生命周期徽标 + 申诉提交·撤回·补充材料写路 + appealStatus 回显 + account-security-ack ×1 写路 + agent-create ×1 自建智能体写路,`playwright test --list` 当前共 21 例(+knowledge-graph);每轮按改动旅程实跑验证——accept-suggestion/knowledge-confirm/security-ack/market 上架徽标·申诉 依赖手工重种子。**2026-06-15 reseed 全部每轮种子依赖后 `--workers=1` 串行整套 20/20 单次全绿**(真实后端 MSW-off;**2026-06-15 已落地可入库种子**:`e2e/global-setup.ts`(pg 直连真实 PG、凭据从 infra.env 读不入库)+ playwright `globalSetup`/`workers:1`,每轮自动复位 graph/confirm-draft/accept(block3→rev1)/security-ack/appeal fixture;`source infra.env && pnpm test:e2e` 即 **20/20 单次全绿、零手工 `/tmp` 种子**(消费态下实证 globalSetup 复位后整套绿;新 agent-create 不消费这些 fixture,本轮以 `E2E_SKIP_SEED=1` 单例实跑)。)**
|
||
- ✅ **2026-06-20:全量 e2e 9 spec/22 用例本地活体单次全绿**(goal=全量e2e真跑通)。PG 宿主 100.64.0.8 恢复在线(直连可达、Flyway 24/public 165 表)→ 查出 jar(Jun-19 00:59)缺 GET bindings 端点(commit 3a7a72f Jun-19 13:30)致 405、**rebuild Jun-20 新 jar**(反假绿:不用过时 jar 跑)→ 起栈 48080(local,infra,清 socks)→ `playwright test` MSW-off 真打:**22 passed / 0 failed / 0 skipped / 0 flaky(9.1s)**——accept-suggestion 正负×2 + account-security-ack + agent-create + knowledge-bindings(**06-19 PG 离线阻塞项 unblock**) + knowledge-confirm + knowledge-graph + live-read×6 + market-publish×8 + workspace。基础种子:核验 4/5 在,**knowledge-bindings 投影固化进 `e2e/global-setup.ts` #6**(可入库、下次自动补);0 红故无就地修。**诚实边界**:本地全栈活体(rebuild jar + 真 PG muse_slice_live),**非 CI**(maven.yml 不跑 e2e/需活体后端+浏览器)。
|
||
- ✅ **2026-06-21:studio 补 4 缺 UI 端面 + 修 planning 二次保存 500(真后端 e2e 真跑)**。按"可端到端验证"补 4 缺口(各 hook+UI+vitest+真后端 playwright):**D Block 分割合并**(`BlockStructureBar`:章节结构条列 block、split 半分/merge 下一节,乐观锁读 revision;e2e split1→2→merge→1 绿);**E 正文来源归因**(`SourceAttributionPanel`:右栏「来源」Tab 读 GET source-attribution,user_original→用户原创;e2e 绿);**F 知识库停用/恢复**(`KnowledgePage` 自建 KB 按 status 切停用(confirm)/恢复;核实真后端 `SummaryRespVO.processingStatus=kb.getStatus()` 透出启用态(disabled/searchable),**排除"RespVO 缺启用字段"误判→无需改后端**;e2e disable→disabled/restore→active 绿);**G 已安装 KB 停用/恢复**(`KnowledgePage`「从市场安装的」卡片按 `muse_knowledge_binding.binding_status` 切停用(confirm)/恢复、保留卸载;installed 启用态存 binding_status,经 list 映射 disabled→'disabled'/else→'installed' 透出,studio normalizeKnowledgeStatus 判 active/disabled;e2e 真后端 disable→disabled/restore→active 绿,global-setup section10 复位 binding id=1)。**修真后端 bug(反假绿,#29 B5 回归)**:全量 e2e 暴露 `planning-edit` save **500**——`ContentPlanningServiceImpl.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 使通过数 34→35;当时唯一 fail=market-publish 列表慢一拍,已修见下)。**已修** `work-schema-binding` flaky:schema-options 由 CreateWorkModal 首页挂载预取(staleTime 60s),全量跑(后端热)请求早于 waitForResponse 注册→race→30s timeout;注册前置到 goto,复跑转绿。**✅ 已修(原唯一 known issue):`market-publish`「提交审核全链」e2e——提交后「我的发布记录」列表慢一拍**。**真根因(逐层排除,推翻此前两次误判[非"无排序"、非"写后读延迟"])**:① **React Query refetch 被 dedup**——save→check→submit 链上 save 的 invalidate 已触发一次 refetch,提交时它仍 in-flight,submit 的 invalidate 被 React Query dedup 到该旧 in-flight 请求(返回提交前快照),refetch 根本没发新请求;② **浏览器误缓存**——vite dev proxy 未透传后端 `Cache-Control: no-store`,浏览器按默认启发式缓存 GET,refetch 命中旧缓存。**决定性诊断**:`browserFetch`(e2e 内 page.evaluate 原生 fetch + `cache:no-store` 直查)拿 fresh 含本次,而 React Query refetch 同时返回 stale→证 refetch 未发新请求(dedup);系统排除了浏览器 HTTP 缓存表层(cache-busting/service worker)、后端无数据(browserFetch fresh)、后端延迟(submit 同步落库)、排序。**修复**(commit `23953fb`):submit onSuccess 改 `cancelQueries` 取消 in-flight + `refetchQueries` 强制发新请求;api client fetch 加 `cache:no-store`(数据新鲜度统一由 React Query 应用层管理)。**验证**:market-publish 全链 e2e 真后端转绿,**全量 e2e 36/0**(原 35/1)、market vitest 4/4、tsc/eslint 0。附带保留后端列表统一倒序(commit `d8ed40d`:`PublishRecordItem` 加 occurredAt 倒序、对齐 market 其它列表 `orderByDesc`,真 UX 改进)。教训:写命令后列表慢一拍优先查 React Query 的 refetch dedup(链上多次 invalidate 竞态)+ dev proxy 缓存头透传,用 page.evaluate 原生 fetch 对比 React Query 取值可一击定位是缓存层还是查询层。studio vitest 全绿(+9 用例,全套 79/79)、tsc/eslint 0。commit:D `d0ea947`/`af78116`/`c76cdec`、E `cc57c59`、F `494f3b5`、G `d4c5305`、planning fix `a9323ad`、work-schema flaky `fa65168`。**#30 盘点收口(Explore 全模块扫描 + 后端逐一核实,反 Explore 假阳)**:另查 5 候选均非"可端到端验证 + 有自然 UI 落点"缺口——① KB 文档处理状态已由 `MaterialManager` 完整实现(非终态轮询 + `generative` 状态标签 + 进度条,非缺口);② 规划候选/③ 文风检查(style-check)/④ 作品导出/⑤ 作品导入 4 者后端均 `*Facade` fail-closed(`CONTENT_EXTERNAL_OWNER_UNAVAILABLE`——ContentStyleCheckFacade/ContentFileFacade/ContentParseJobFacade,同 publish/account-export 属外部依赖后置,用户触发即拒、不可干净 e2e);⑥ 取消任务(job cancel,AppMuseJobController)后端纯状态变更**本可验证**,但 studio AI 流走 SSE 不透 jobId、异步 job 路径或不同源(文档处理非 muse_ai_job)或外部依赖→**无自然 UI 落点**(需改 SSE 协议透 jobId,属新功能非补按钮),后置。**故本轮 studio "可端到端验证 + 有自然落点"缺口全集 = D/E/F/G,已补完;#30 收口**。教训(承 `muse-kb-status-semantics`):盘点缺口的可验证性必须读后端 service 的 facade/异常分支核实,Explore 静态扫的"可验证"初判 4/4 假阳(全是 `*Facade` fail-closed),不可直接采信。
|
||
- ✅ **2026-06-21:补个人中心市场记录三件套缺的两件 e2e(购买/授权,反假绿)**。盘点 studio account 面:`useAccountPurchases`/`useAccountLicenses`(PersonalCenter「我的购买」/「我的授权」区)有 UI+hook 但缺真后端 e2e(假绿风险);核实三者与已绿的「我的发布」**同 controller(`AppAccountMarketRecordController`)+同 service**(`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 /profile→code: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 500、rebuild+重启后 code:0+version 2→3。**连带修测试污染**:`agent-create.spec` uniqueName=Date.now() 不幂等每跑新建 agent,累积 22 条后按 updatedAt 倒序把种子「活体测试智能体」挤出后端默认分页第一页,致 live-read ai 断言从绿变稳定红;global-setup 加第 11 节删 e2e 前缀 agent、保留种子(commit `3ffee35`)。**全量 e2e 39/0**。教训:LambdaUpdateWrapper.set 写 jsonb/json 列必须显式带 typeHandler(不继承 DO @TableField);写路 e2e 用唯一值避免 pre-existing 假绿,但唯一值累积会污染列表类断言,需 global-setup 清理配套。
|
||
- ✅ **2026-06-21:补权益配额/用量归属真后端 e2e + 个人中心 account 面 e2e 全闭环**。`UsageStats`(GET /account/entitlements 套餐/配额/发布能力 + GET /account/usage Token 用量/按归属分布)此前无专门 e2e(live-read 仅断言 profile nickname、未覆盖 UsageStats);curl 证两端 code:0 真后端就绪(非 facade unavailable)。补 `account-usage.spec.ts`(验 200/code:0 + 「权益与配额」/「归属分布」区块渲染,不依赖数值,commit `1dbbfc7`)。**至此个人中心 account 面真后端 e2e 全闭环**:profile 读(live-read)+ 写(account-profile-update)、权益配额、用量归属、购买/授权/发布三件套(account-market-records + account-publish-records)、安全事件 ack(account-security-ack)。**全量 e2e 41/0**(本会话 35/1→41/0:净增 6 真后端 e2e、修 market-publish 慢一拍 + profile update 500 两真因、清 agent 测试污染)。
|
||
- ✅/⚠️ **2026-06-21:修新建章节缺契约字段(前端真 bug)+ 挖出后端 order_no 软删 schema bug(反假绿,后端待人类定 DDL)**。延 #30 盘 content/editor 旅程发现:前端 `useChapterCreate` 只传 `{title}`,而后端 `ChapterCreateReqVO` 强制 `commandId`(幂等)+ `expectedWorkRevision`(作品乐观锁),缺失被 @Valid 拦成 400——dev mock 不校验长期掩盖、真后端建章必败。修:补两字段 + 经 WorkspacePage→ChapterPanel(props)→useChapterCreate 透传 work.revision、建章后失效 workDetail 缓存(commit `ca33c8e`);curl 证干净作品 create code:0。**修前端后请求合法到达后端,又暴露独立后端 bug**:`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 create→delete 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 溯源)**P1–P3 全缺**——knowledge `MuseKnowledgeBaseDO.sourceMarketAssetId` 字段在却**无人写入**、binding `kb_id=parseLong(sourceId)` 直用预存 kb id(`MuseKnowledgeBindingService:110`)、market install 不建 kb 只落 license 投影(`MarketInstallServiceImpl:63` 注释明示);agent 连该字段都无 + 0 物化代码。**P1 e2e 绿靠 fixture 巧合**(asset1→`kb_id=1` 恰命中预存 kb1)。红线真生效属实,但"market 资产真正变成作品可用 kb/agent"未接,列**独立后续主线**。P2 按用户决策取**最小验证口径(方案 A)**:加字段 + 支持 `agent_type='market'` + seed market agent fixture + 放宽 + verify/consume + e2e,验证放宽红线真生效;install 自动物化后续。
|
||
- ✅ **2026-06-22:handoff 跨空间统一接入 P2 agent 兑现侧(最小验证放宽红线,真后端 e2e 反假绿,4 commit)**。承 P0 基座 + P1 knowledge,按用户决策三连(先出 P2 评审版 → market→agent 物化取"独立 market 类型" → P2 范围取方案 A 最小验证)。**后端**:ai-server 依赖 market-api;`AgentSlotPrecheckReqVO` 加 sourceType/handoffToken/sourceId/sourceVersion/authorizationSummaryId、precheck DO 加 sourceOwner/handoffHash、muse_agent 加 source_market_asset_id(V27 迁移,全 nullable 向后兼容);precheck market_agent 来源调 verify(targetOwner=agent)+consume(token 明文仅 precheck 阶段持有、bind 凭 precheckId 不再持 token)、**放宽 requireVisibleActiveSourceAgent 仅对已 verify 的 market handoff 跳过 agentType∈{system,user} 校验**(active + version active 仍校验、保护节点/AI 授权隔离不破),bind 凭 precheck.source_owner 标记同款放宽(bind 无 token、不能重验)。**前端**:AgentHandoffLanding 兑现侧落地组件(agentSlotPrecheck market_agent+token→setPrecheck token 用完即弃→bindAgentSlot 凭 precheckId)+ useAgentHandoff hooks + HandoffLandingPage owner dispatch +agent。**真后端 e2e**(handoff-agent.spec,48080+真 PG+V27 真列):正路 bind-precheck(targetOwner=agent)→createHandoff 签 token→agent precheck 后端 verify+consume+放宽接纳 market 类型 agent→bind 落槽位(slotRevision=2)、负路伪造 token 被 verify 拒(0 写),2 passed。验证:MuseAgentSlotServiceTest 25/0(5 放宽红线单测:接纳已验/拒伪造/拒缺 token/拒非 handoff 的 market 型 agent/bind 凭 source_owner 放宽)+ Bc/AiGrant ArchUnit 3/0、前端 tsc/eslint+vitest 93→97(AgentHandoffLanding 4)、V27 已应用共享 muse_slice_live(flyway "now at version v27",用户拍板应用)、全量 e2e 48→50(handoff-agent +2;唯一 flaky=knowledge-disable-restore 全量时序、单跑 2/2 绿、用 KB id=1 与 handoff 用 work4 无关、非 P2 回归)。⚠️ **诚实范围**(承 P1 物化订正):P2 取最小验证口径——**market→agent 资产物化(install 自动建 agent_type=market 实体 + source_market_asset_id 溯源)未接**,e2e 用 seed market agent fixture(global-setup #13:固定 agent_key + active version + work4 槽位)替代;来源侧发起入口(MarketAssetDetailPage agent 按钮)因 sourceAgentId 依赖物化故暂不做(物化后接入)。放宽红线(只接纳 verify 通过的 market token、伪造/缺 token/非 handoff 的 market 型 agent 全拒)真生效属实。**剩 P3 content(asset_use 从零)+ 资产物化(install 自动物化 kb/agent)独立主线。**
|
||
- ✅ **2026-06-22:handoff 跨空间统一接入 P3 content 兑现侧(asset_use 从零、完整闭环,真后端 e2e 反假绿,2 commit)**。承 P0 基座 + P1 knowledge + P2 agent,按用户拍板(Q1 单表/Q2 记录+AI 上下文/Q3 purposes 禁 template/Q4 完整闭环/Q5 work 级 revision)。**后端**:content-server 依赖 market-api;V28 建表 `muse_content_work_asset_use_precheck`(单表即事实载体 active→consumed,照 knowledge bind_precheck,全 nullable 向后兼容);两段式 `MuseContentAssetUseService`——precheck 段 market_asset 来源调 verify(targetOwner=content/targetAction=asset_use)+consume(token 明文仅此段、create 凭 precheckId 不再持 token)、purposes 白名单 reference/ai_context/generate_reference(禁 template=`CONTENT_ASSET_USE_PURPOSE_INVALID`)、create 段 work 级乐观锁(expectedWorkRevision)落使用事实;错误码 `1_041_002_xxx`。**前端**:ContentHandoffLanding 兑现侧(bind-precheck targetOwner=content 拿可信 source→assetUsePrecheck 核销 token→读 work revision→createAssetUse 凭 precheckId)+ useContentHandoff hooks + HandoffLandingPage content dispatch + **02F MarketAssetDetailPage「用于作品(进入作品空间)」来源侧发起入口(asset_use 不依赖物化、sourceAssetId 真实,故比 P1/P2 更完整、无 fixture 替身)**。**真后端 e2e**(handoff-content.spec,48080+真 PG+V28 真表):正路 bind-precheck(content)→createHandoff(content/asset_use)签 token→asset-use-precheck 后端 verify+consume→asset-uses 落使用事实(单表转 consumed、assetUseId=precheckId)、负路伪造 token 被 verify 拒(0 写),2 passed(global-setup #14 每轮清 work4 asset_use precheck)。验证:`MuseContentAssetUseServiceTest` 8/0(正路 verify+consume/伪造拒/缺 token 拒/禁用 purpose 拒/越权拒/create 闭环/work revision 冲突/precheck 过期)+ BcBoundaryArchTest 0 违例(content→market-api 经端口、不碰 market.dal)、前端 tsc/eslint+vitest 97→101(ContentHandoffLanding 4:就绪/闭环/核验拒绝/会话失效)、**V28 已应用共享 muse_slice_live(flyway "now at version v28",用户拍板应用、rebuild jar + 重启 48080)**、全量 e2e 50→52(handoff-content +2;唯一 flaky=knowledge-disable-restore 全量时序、单跑 2/2 绿、用 KB id=1 与 content 用 work4 无关、非 P3 回归)。**至此 handoff token 红线三 owner(knowledge P1 / agent P2 / content P3)端到端全覆盖。** ⚠️ **诚实范围**(承 P1/P2 物化订正):content asset_use **本质=「使用授权事实记录」非资产物化**(落 precheck 表凭证、sourceAssetId 直引真实 asset id,无「market 资产变 content 实体」步骤),故 P3 无 A/B 物化拆分、来源侧发起入口天然完整;Q2 锚点「AI 上下文消费」(asset_use 作 AI 生成链上下文来源、经 `muse_ai_candidate_decision_archive.work_asset_use_precheck_id` 引用)**另立、不在 P3**。**剩 market→knowledge/agent 资产物化(install 自动建 kb/agent 实体 + source_market_asset_id 溯源)独立主线。**
|
||
- ✅ **2026-06-24:AI 生成命脉真后端端到端打通(逐条破除 line176 四重阻塞,反假绿,commit 86c6dba/df063cb/9115d4f)**。承 line176"AI 生成 ⚠️ 四重阻塞"逐条解除:① **AIPanel 补全上下文引用**(df063cb 前端 MVP:AIPanel 传 workId/blockId/chapterId/agentSlotKey + WorkspacePage 透传真实上下文 + mock 收紧 workId 必填 + contract 断言反向验证,前端单测 101/101);② **02D 槽位绑定首次创建死锁已修**(9115d4f:precheck/bind 都 `requireSlotBinding` 缺行抛 forbidden、而"替换"是设计中唯一创建入口("替换"=首次写入、无独立创建端点是有意,后端-04 line748/产品-02D line507)→死锁,普通用户首次绑定永不可达(work4 seed binding 实为 E2E 绕 bug 手插);修=precheck 缺行放行 + bind 抽 `persistBinding` upsert(无行 insert revision1 避免首次 expectedSlotRevision null NPE/有行 updateById 沿用乐观锁)+ V29 `uk_muse_agent_slot_binding_active` partial unique index + 前端 mock protected 口径对齐 `protected:` 前缀;`MuseAgentSlotServiceTest` 26/26+Controller 4/4);③ dispatcher 本轮重启正常调度(initial-delay 8s,非 line176 的 24h 禁用);④ New-API 在线真验(MiniMax-M2.5,"本机不可用"已过时);外加 **P-A 检索 miss 根因修复**(86c6dba:`HttpRagFlowKnowledgeRuntimeClient` 把 `document_ids` 以 null 入 retrieval body→RAGFlow code102"documents should be a list"拒→检索 fail-closed→chunkCount=0(task3/4/5/6 全 0 即此);修=null 不入 body)。**真后端 happy-path 真验(muse_slice_live,真 API 非 mock/stub)**:work1 `writing.continuation` precheck(不再 forbidden)→bind 首次建 binding(slotRevision=1 active)→GET 槽位显示 agent1→AI task POST `/app-api/muse/ai/tasks` 用 `agentSlotKey`(非 agentOverrideRef)→agent1 解析 + runtime 授权 envelope → completed + suggestion7(GET `/app-api/muse/suggestions/7` 真 LLM"星环大陆魔法体系与元素对抗禁咒"续写、finishReason stop)。**专题-03 P-A/P-B/P-C 完整 e2e + 前端 MVP agentSlotKey 路径真后端端到端走通**,line176"AI 生成链 e2e 一律 stub /ai/tasks、最关键创作命脉绿在 mock 上"的最大假绿点消除。V29 由 Flyway 启动日志证 applied v29(用户拍板应用 muse_slice_live)。⚠️ **诚实范围/仍缺**:Override Slot Contract 主数据(方案 B:合法 slot 校验/系统默认 agent 来源/`listWorkAgentSlots` 预设骨架未做,slotKey 暂自由字符串、listSlots 缺行仅返回已绑定 slot)未做、属人类架构决策域;SlotBindingPanel 绑定流(precheck→bind)本就完整、**workId 硬编码已解**(2026-06-24:AgentPage 接 useWorkList 作品选择器替代硬编码 WORK_ID_FOR_SLOT_PREVIEW='1'、AgentPage.contract test 验作品选择→正确 workId 下传、vitest 101→102;盘点"无真正绑定流"过时=实为后端死锁挡着 bind 必失败);**槽位绑定 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 最小门禁 / ⏸ 完整物理包拆分后置。
|