176 Commits

Author SHA1 Message Date
lili
f3f7a0962f feat(content/knowledge/ai): B 四维 VERIFIED_ZERO 贡献者 + 机械化断言[P2]
5 维度贡献者齐全(Planning REAL_COUNT 已落,本次补四个 VERIFIED_ZERO):

- Work/Export(content):work 仅绑 schemaId 不存字段值、ExportTaskDO 零 schema 引用→VERIFIED_ZERO;机械化断言 DO 无动态字段值列(漂移即失败)。

- KnowledgeProjection(knowledge)/AIContext(ai):零 meta 引用(projection 是 CQRS 读模型、metadataFields 是向量库)→VERIFIED_ZERO;knowledge/ai-server 加 meta-api 依赖;机械化断言贡献者无数据依赖字段。

验证:content 9/9(Verified 4+Planning 5)、knowledge 2/2、ai 2/2。下一步:单体装配验证 RealMetaImpactFacade 收齐 5 维度、all-real 不再 fail-closed。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 01:54:06 -07:00
lili
94a23797ff feat(content): B 字段级地基 - planning 字段用量快照表 + Planning 贡献者[P1]
M 全量字段级落地(人类第三轮确认 B):planning content_payload 是自由 map(key≠fieldKey)无法字段级计数,故补每实例字段快照表显式承载。

- V25 muse_content_planning_field_snapshot(section_id/work_id/schema_id/field_key)+ DO + Mapper(走 LambdaQueryWrapperX,tenant/deleted 框架自动注入,避免聚合 SQL 多租户不确定性)。

- SavePlanningItemReqVO 加 usedFieldKeys;ContentPlanningServiceImpl.captureFieldSnapshot 保存时按 work.workSchemaId 写快照(未绑 schema→no-source 只清不写,不伪造 0)。

- ContentPlanningUsageContributor(PLANNING/REAL_COUNT):据快照 distinct section 算实例级关联 + removed/typeChanged/visibility 字段级命中。

验证:content 38/38(ContentPlanningServiceTest 15 含 captureFieldSnapshot、ContentPlanningUsageContributorTest 5、ContentAppServiceTest 18 不破)。execution doc 记录第三轮决策与调查发现。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 01:48:15 -07:00
lili
0fd7a60f66 feat(content): D1-3 work schema 选项端点(前端选 schema)+ 单测[P1]
D1 落地链第三环:content app-api 暴露 GET /works/schema-options(经 MetaSchemaQueryApi 拉 active schema,不跨 BC 查 meta.dal),供 studio work 创建/编辑选 schema。WorkSchemaOptionRespVO(id/schemaKey/displayName/targetType);端点置 /works/{workId} 之前(字面量段优先)。

验证:ContentAppServiceTest 18/18(+1 listWorkSchemaOptions)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 00:52:07 -07:00
lili
cd85d9d649 feat(content): D1-2 work→schema 绑定写入(激活 workSchemaId)+ 单测[P1]
D1 落地链第二环:激活 WorkDO.workSchemaId(此前死代码)。content-server 加 meta-api 依赖;WorkCreate/UpdateReqVO 加 schemaId、WorkRespVO 加 workSchemaId、ContentConvert 映射;createWork/updateWork 经 MetaSchemaQueryApi 在可信边界校验 schema 为 active(无效抛 CONTENT_WORK_SCHEMA_INVALID,不落库脏绑定),写入 workSchemaId。

schemaId 可选:不传则 work 不绑 schema(workSchemaId null,影响预览按 no-source 排除、不伪造 0);历史 work 同理。work_schema_id 列 V1 已存在,无需 Flyway。

验证:ContentAppServiceTest 17/17(4 新:有效绑定/无效拒绝不落库/无 schema 不调端口/更新绑定 + 13 回归)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 00:49:15 -07:00
lili
be907fbb15 feat(meta): D1-1 MetaSchemaQueryApi 对外 schema 查询端口 + 单测[P1]
D1(work 绑定 schema)落地链第一环:消费域 content 经此端口发现/校验可用 schema,不跨 BC 查 meta.dal(BcBoundaryArchTest 门禁)。meta-api 新增 MetaSchemaQueryApi(listActiveSchemasByTargetType 供 work 创建选择 + getActiveSchemaById 供绑定写入前校验)+ MetaSchemaBriefDTO(最小投影);meta-server MetaSchemaQueryApiImpl(@Service 读自有 schemaMapper,仅 active 可作绑定目标)。

验证:单测 5/5(targetType 过滤/全列/按 id 查/非 active null/不存在或 null id)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 00:42:59 -07:00
lili
a39c630940 feat(meta): probe 携带 schemaId 供消费域跨 BC 匹配[P1 前置]
D1(work 绑定 schemaId)落地前置:消费域 content 只持有 schema 数字主键绑定(work.work_schema_id BIGINT),不能跨 BC 查 meta.dal 做 id↔key 转换(BcBoundaryArchTest 门禁禁 .dal/.application 跨域)。MetaSchemaImpactProbe 加 schemaId(Meta 侧由 schemaKey→id 填充),贡献者按本域标识匹配。RealMetaImpactFacade 组 probe 时填 schema.getId()。

验证:meta 14/14(聚合器 5 + PreviewServiceTest 9 回归)绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 00:05:32 -07:00
lili
4bd292f846 feat(meta): P0b meta-api 用量贡献者端口 + RealMetaImpactFacade 聚合器(替换 Unavailable)
meta-api 新增 4 端口契约:MetaImpactDimension(5维度)/MetaSchemaImpactProbe(草稿+三破坏集)/MetaSchemaDimensionImpact(REAL_COUNT|VERIFIED_ZERO,无 unknown 态)/MetaSchemaUsageContributor(进程内 @Service Bean,各 BC 实现)。

RealMetaImpactFacade(@Primary @Service)替换 UnavailableMetaImpactFacade:破坏判定(G1)与实例计数(各域贡献者)分离——调 G1 组 probe、fan-out 各域、all-real 门(5维度齐全+全非null realityKind;缺维度/重复维度/null 均 fail-closed)、DTO→既有 VO 映射(口径对齐既有 PreviewServiceTest)。退役 Unavailable @Service,单体内仅一个 MetaImpactFacade Bean。

当前 P1/P2/P3 贡献者未接入→注入空 List→缺5维度 fail-closed,等价现状(preview 不放行),待贡献者接入自然真实化(渐进替换、平滑可退)。

验证:单元 14/14(聚合器 5 + 回归 PreviewServiceTest 9/9 mock 不破)。单体启动装配验证进行中。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 23:57:32 -07:00
lili
a1600d28ce feat(meta): G1 破坏字段集生产者(移除+类型变更+可见性diff) + 单测[P0a]
meta-schema 用量投影 P0a 地基第一块。补齐 v0.1 误称已存在、实则缺失的破坏集计算:现有 compatibility() 仅算 type_changed 且 draftField!=null 守卫使移除字段不产破坏;字段级可见性只在 policySnapshot JSON 不在列。

MetaSchemaBreakingFieldSetProducer(纯逻辑、无 DB 依赖、可单测)产出三类破坏集:removedFieldKeys(active−draft,补齐漏算)、typeChangedFieldKeys、visibilityChangedFieldKeys(解析两版 policySnapshot 逐维度 diff,5 维度与 MetaVisibilityPolicyDO 口径对齐)。fail-safe:可见性任一维度变化即报、移除字段不重复计入可见性。

验证:单测 5/5(三类各产非空集 + 无破坏空集 + 移除不双计)。真实 PG IT 待 P0b 聚合器接入后(producer 输入由聚合器查 DB 提供)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 23:45:12 -07:00
lili
784c24e759 feat(ai): 补 Security Tool Grant 本地策略审批 facade(打通工具授权链) + 单测
缺口:SecurityToolGrantApprovalFacade 仅 Unavailable 兜底(恒拒 AI_TOOL_GRANT_NOT_APPROVED)→ admin 登记 Tool Grant 必败 → runtime 永查不到已批准 grant 投影(闭环陷阱:runtime 侧 ProjectionSecurityRuntimePermissionFacade 已就绪+测试,但唯一写投影入口被堵死)。

新增 LocalSecurityToolGrantApprovalFacade(@Primary 压过 Unavailable):以 Security owner 身份做策略式合规审批——校验 scope/egress 取值合法(取值集与 runtime 侧对齐,防越界 scope 落库)即批准、否则驳回。

诚实标注:approvedBy=security-policy-local、approvalId 带 security:local: 前缀(经 grant.action 透传 runtime envelope),明示单体内本地策略审批而非外部 Security 人工审批,绝不伪造外部批准;与 admin RBAC 门禁(muse:ai:tool-grant:adjust)叠加。刻意不做:grant/runtime 物理分包(独立 P2)、外部 Security RPC(P1R-4 推迟)。

验证:facade 单测 7/7(approved+越界/空refs/非法refType/开放出网无目标 驳回 + @Primary 装配选主断言);回归 service 6/6、runtime 15/15、controller 注解 2/2 全绿(共30);重建 muse-server jar 单体启动成功(20.4s,无 NoUniqueBeanDefinition/BeanCreationException)。admin curl 端到端被 RBAC 拦 403(鉴权层,facade 之前,预期安全边界)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 22:53:05 -07:00
lili
5a137f1861 test(studio): bindings 读回 live e2e spec(ready-but-unrun,镜像 graph spec)
muse-studio/e2e/knowledge-bindings.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 兜底,全栈 muse-server 起不来。PG 宿主恢复后按 .agents/knowledge §六 起栈(redis 本机可启、jar 需重建含 GET 端点、muse_slice_live seed work1 绑定)即可跑。后端 218 + studio 50/tsc/build 已绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 22:49:46 -07:00
lili
11186b638c feat(studio): 知识来源绑定读回面板(useKnowledgeBindings + KnowledgeBindingsPanel)
studio 新增 useKnowledgeBindings(workId) hook 读 GET /works/{workId}/knowledge-bindings、解 bindings 数组(id 维持字符串契约);KnowledgeBindingsPanel 镜像 KnowledgeDraftPanel(work-scoped 只读、空/错不占位、来源类型+状态中文徽标)接入 KnowledgePage。至此 bindings 写→读→端点→FE 读回展示链打通。

测试:契约测试(命中 /app-api/muse/works/{id}/knowledge-bindings + 解析数组)+ 组件测试(渲染绑定来源 + 空态不占位);全 studio vitest 50/50、tsc 干净。组件按 AIPanel 先例导入 React + React.FC/React.createElement 适配 vitest 经典 JSX 转换且满足 noUnusedLocals。

诚实边界:rendered-UI 活体证(playwright MSW-off)需运行中全栈 app(env 受限),本切片未跑 live e2e。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 13:44:41 -07:00
lili
3a7a72fa88 feat(knowledge): 补 GET bindings 读端点(作品已绑来源读回)
AppMuseKnowledgeBindingController 加 GET /muse/works/{workId}/knowledge-bindings → bindingService.listKnowledgeBindings:先 requireWorkOwner 过信任边界防越权读他人作品来源绑定(IDOR),再 selectActiveByWorkId 读回投影读模型,id 转字符串对齐契约(防前端大整数精度丢失),X-API-Version guard 同既有端点。

至此 bindings 读回后端腿(绑定确认写投影→按 work 读回→GET 端点)闭环,仅余 FE hook。新增 AppKnowledgeBindingVO.BindingListRespVO/BindingItemVO。

测试:listKnowledgeBindings happy-path 字段映射 + 越权 fail-closed(requireWorkOwner 抛错则绝不查投影);knowledge-server 整套件 218/218 绿(clean 重编译,反假绿)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 13:30:53 -07:00
lili
1c8da86e82 fix(knowledge): unbind 真软删(修 @TableLogic 空操作)+ 投影读回嵌入式 DB 坐实
8aad7a4 的 markDeletedByBindingId 用实体 setDeleted(true) 试图软删,但 deleted 是 @TableLogic 字段,会被 MyBatis-Plus 在普通 update 剥离 → 解绑实际未生效,行仍出现在 selectActiveByWorkId 读回。改用 setSql("deleted = true") 强制写该列(H2/PG 通用)。

反假绿:新增 MuseKnowledgeSourceBindingProjectionRoundTripTest(嵌入式 H2 真往返)端到端坐实 bind 写投影→按 work 读回、unbind 后读回消失、同源绑定到其它作品的投影存活;此 bug 即由该测试挖出(此前仅 mock 写证据无法暴露)。MapperTest 改为断言 setSql 真机制(原断言 update.getDeleted()==TRUE 实为被剥离的空操作)。

附:补齐 knowledge 模块首套嵌入式 DB 测试基建(application-unit-test.yaml + create_tables.sql + clean.sql,logic-delete 对齐 muse-server 生产 true/false)。

验证:RoundTripTest 2/2、knowledge-server 整套件 216/216 绿(clean 重编译,反假绿)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 10:03:09 -07:00
lili
8aad7a4b1b fix(knowledge): 绑定确认回填来源投影 + 唯一键补 work_id
绑定确认为 source binding projection 读模型的权威回填点:bind 成功后写投影行;unbind 按 bindingId 作用域撤销,不误伤同源绑定到其它作品的投影。

唯一键补 work_id(V24):同源 KB 可被同一用户绑定到多个作品,旧唯一键缺 work_id 会把合法跨作品复用误判为冲突;改为含 work_id 的 partial unique index(WHERE deleted=FALSE)。

验证:MuseKnowledgeBindingServiceTest + MuseKnowledgeSourceBindingProjectionMapperTest 11/11,knowledge-server 整套件 214/214 绿(clean 重编译,反假绿)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 09:31:56 -07:00
lili
bc63a35e88 fix(knowledge): audit impact preview owners 2026-06-19 08:18:46 -07:00
lili
8c1696c59a fix(knowledge): hide deleted installed bindings 2026-06-19 08:09:46 -07:00
lili
d5f62a16e4 test(ai): guard runtime from tool grant writes 2026-06-19 07:56:49 -07:00
lili
6217029989 fix(gateway): route muse api through muse server 2026-06-19 07:46:15 -07:00
lili
9d5430b62c test(studio): add live agent create e2e 2026-06-19 07:35:53 -07:00
lili
765bf749f2 docs: close stale ai stream drift todo 2026-06-19 06:23:36 -07:00
lili
bb59f98c16 chore(ai): remove empty contract server module 2026-06-19 04:30:01 -07:00
lili
c66d2b9b82 ci: wire openapi diff workflow at root 2026-06-19 04:19:35 -07:00
lili
984c6db583 test(p1r): require coverage evidence test files 2026-06-19 02:38:29 -07:00
lili
878acef255 test(infra): 对象存储真实往返集成测试(LocalFileClient,反假绿)(U9 Part1)
FileServiceLocalStorageRoundTripTest:真实 LocalFileClient(临时目录)+真 FileServiceImpl+嵌入式 DB,跑 createFileReturningPath→真实落盘→按 path 字节级回读全链路;内容含 CJK+全字节(0..255)二进制,断言磁盘字节==上传字节、回读字节级一致、未知 path fail-closed(FILE_NOT_EXISTS)。无需 MinIO 即真后端真往返。2 测试绿(亲跑验证)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 01:09:49 -07:00
lili
4ceca21f73 feat(infra): 存储 SDK 异常脱敏 + dev/test 文件配置种子 + RBAC 复核 (U7)
- R4 凭证脱敏(发现真实泄漏):S3/MinIO SdkException 原始 message 内嵌 endpoint/bucket/access key,经 GlobalExceptionHandler 全栈日志 + 落 infra_api_error_log 外泄。FileServiceImpl 在边界 catch SdkException 改抛 ServiceException(FILE_STORAGE_OPERATION_FAIL),只记 errorType、不挂 cause(杜绝 message 经兜底回流)。+2 单测断言假密钥不外泄。
- Provisioning:新增无密钥幂等 LOCAL master FileConfig 种子 sql/dev/muse-file-config-master-seed-postgres.sql(强制走字节代理)+ MinIO env 占位模板。
- RBAC:FileConfigController 全端点 @PreAuthorize('infra:file-config:*') 已满足,无改动。
- FileServiceImplTest 21 绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:59:26 -07:00
lili
00dcb2b8d6 feat(member): 真 AccountFileServiceFacade 接通对象存储 + 账户导出脱敏 (U6)
- RealAccountFileServiceFacade @Component @Primary:createExportTask(BC 内按 exportType 组装账户主体数据→R4 脱敏→size guard→createFileForPath,fileRef=稳定 path);downloadExportPackage(getFileBytes 字节代理)。member 拓扑/autoconfig/Unavailable/caller/pom 均未动。
- AccountExportRenderer(KTD4 member 轻渲染):in-BC 读、限 accountUserId;脱敏 standard/strict,未知→STRICT fail-closed,绝不输出原始 PII(mobile/ipAddress);deviceInfo 不导出。
- credentialId=null(凭证由 AccountExportServiceImpl HMAC 自持,避免重复铸造);status=completed 对齐 normalizeCreateStatus。
- 全路径 fail-closed(FileApi 缺/超限/抛错/敏感类型→unavailable),日志仅 ids/errorType。
- 14 facade + 19 caller 回归 + 3 拓扑 测试全绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:47:14 -07:00
lili
0a83c05e6a feat(content): docx/epub 导出渲染器(纯 JDK,无新依赖)(U4)
- DocxExportRenderer/EpubExportRenderer @Component implements ExportRenderer,纯 java.util.zip 手写最小 OOXML/EPUB:docx=[Content_Types].xml+_rels/.rels+word/document.xml(段落,Heading1 标题);epub mimetype 首条且 STORED(application/epub+zip)+container.xml+content.opf(EPUB2)+toc.ncx+逐章 XHTML。全文 XML 转义、UTF-8。
- 工厂经 List<ExportRenderer> 注入自动登记,未改工厂。muse-dependencies 未动,离线可构建。
- 跨单元修正 RealContentFileFacadeTest:docx 已注册→available(原'未注册→unavailable'前提失效),保留未知格式串→unavailable 及全部安全断言。
- 44 测试绿(docx7/epub8/factory4/facade25)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:44:21 -07:00
lili
1970431730 feat(content): 导入检视 SSRF 防护 + scanStatus 服务端权威 (U5b)
- inspectImportFile:① uploadUrl 过 SSRF 白名单(https-only/禁 userinfo/路径穿越/字面 IP·元数据·内网/非默认端口/host 字典命中,IDN→ASCII,不解析 DNS 防 TOCTOU,默认空=全拒,复用 MuseKnowledgeMaterializationService 范式);② scanStatus 服务端权威——仓内无扫描链路+import 表无 scan 列→恒 scan_blocked,客户端自报 clean 一律忽略;③ 仅服务端 clean 才 available(当前不可达,留待真扫描接入)。
- 任一阶段受阻→unavailable,调用方据 !available() 拒建任务,不伪造导入。日志仅 ids/errorType。
- RealContentFileFacadeTest +12(共 25 绿);ContentImportParseServiceTest 14 绿无回归。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:35:14 -07:00
lili
a284607762 feat(content): 真 ContentFileFacade 导出/下载接通对象存储 (U5a)
- RealContentFileFacade @Component @Primary:createExportPackage(BC 内组装 canonical→渲染→size guard→createFileForPath,packageRef=稳定 path,凭证 UUID+TTL);downloadExportPackage(getFileBytes 字节代理)。
- KTD2 拓扑:移除 UnavailableContentFileFacade 的 @Service/@ConditionalOnMissingBean(改纯类),MonolithFacadeFallback @Bean 兜底完好。
- 全路径 fail-closed(FileApi 缺/超限/抛错→unavailable,不抛不伪造,@Transactional 回滚);catch 只记 errorType 不记 message(不泄存储细节)。
- RealContentFileFacadeTest 13 绿;muse-server 编译通过。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:25:09 -07:00
lili
18b7c12417 feat(content): 导出渲染器端口 + txt 实现 (U3)
ExportDocument/ExportChapter DTO + ExportFormat(txt/docx/epub MIME/ext) + ExportRenderer 端口 + TxtExportRenderer(纯 JDK,UTF-8) + ExportRendererFactory(EnumMap,未注册格式 fail-fast)。端口可扩展:U4 加 docx/epub 只需 @Component。11 单测绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:16:44 -07:00
lili
9eb280615e feat(infra,content): 接通对象存储读腿 — FileApi 按 path 字节取回 RPC + content 接入 infra-api (U1,U2)
- U1: content-server pom 加 muse-module-infra-api 依赖(monolith 内 FileApiImpl bean 满足注入,无需 @EnableFeignClients)。
- U2(P0 修复): FileApi 加 createFileReturningPath(返回稳定 path)+ getFileContentByPath(按 path 字节代理); FileServiceImpl 抽 doUploadFile 复用并新增两法; FileMapper.selectByPath; 无记录 fail-closed 不裸取。私有桶下签名 url 不可作稳定句柄,故下载按 path 键。
- FileServiceImplTest 补 3 单测,19 全绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:10:08 -07:00
lili
8963383233 test(ci-green): 清全 reactor 4 处潜伏陈旧测试,mvn test 史上首次全绿
CI 从未在本特性分支跑过(maven.yml 仅 push/PR-to-main 触发),积累潜伏红。以 mvn -pl muse-server -am test -fae 全 reactor 逐模块解锁排查(上游 fail-fast 会 SKIP 下游),本提交清 4 处(另 2 处 market PublishRecordItem/coverage 台账已随前序 commit):

- knowledge/ai Content*WorkOwnerFacadeTest: 陈旧断言 @ConditionalOnBean(2026-06-14 单体修复已去除、改 @Primary 总注册压兜底)
- ai MuseAiEventPublishOutboxMapperTest: 真 PG 用例无 PG 时硬 fail→改 assumeTrue skip(与 P1r external-acceptance env 缺失即 skip 约定一致、honest 非假绿;有 PG 仍真跑保真)
- muse-server P1rKnowledgeMigrationSqlTest: 元测试钉死 TARGET_VERSION="14"→版本无关化(被验收 IT 已按 4d46d7a 动态自适应,元测试不应自犯硬编码版本病)

验收:mvn -pl muse-server -am test -fae 全 reactor BUILD SUCCESS、0 失败/错误、所有模块 SUCCESS(真 PG 类无 PG 时 skip)。教训:跨模块重构后须跑 -fae 全量,勿只跑改动模块。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 15:01:41 -07:00
lili
c219d7e205 test(bc): 跨域 .application 边界门(BcBoundaryArchTest 平行 .dal 规则)
承 bc-boundaries §四遗留 + MarketAccountProjectionFacade 收口(facade 端口统一上移 -api)。

- BcBoundaryArchTest 新增 no_business_bc_may_depend_on_another_bc_application
  (平行既有 .dal 规则、共用 BUSINESS_BCS / KNOWN_VIOLATION_EXEMPTIONS):
  禁任一业务 BC 依赖他域 .application(service / facade 实现);.application 端口
  已无合规跨域通道(均在 -api),故直接禁止、无需为 facade 留例外
- 验收:BcBoundaryArchTest 2/0F(.dal + .application 均绿,ArchUnit 字节码级);
  全仓扫描跨 BC .application import = 0
- 反假绿反向证:同款检测逻辑临时指向 .api(已知有跨 BC 引用)→ 找到 238 例违例,
  证明检测机制非空转、绿是因真无跨域耦合(期间踩 Maven 增量编译陈旧坑:仅改谓词
  不重编译致假绿,须 rm maven-status 或 -Dmaven.compiler.useIncrementalCompilation=false)
- 同步 bc-boundaries §二/§四 + 台账 §一 TODO

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 14:22:30 -07:00
lili
4e9923ce68 refactor(market): pom 坐标收口 market→member-api(facade 移入 member-api)+ tenant 依赖诚实化
承 bc-boundaries §三遗留(更深一层 BC 收口)。market-server pom 此前依赖
muse-module-member-server(可见 member 全部 internal),根因是 market 唯一引用的
member-server 类型 MarketAccountProjectionFacade(单方法读校验端口、无 DTO)。

- 接口 MarketAccountProjectionFacade 从 member-server application.account.facade
  移到 member-api api.account(对称写端口 MuseAccountRecordProjectionApi:member 定义端口、
  market 提供适配器 MarketAccountProjectionProvider、member-alone 回落 Unavailable*,
  符合 bc-boundaries §一"本域定义端口、他域提供适配器")
- market-server pom: muse-module-member-server → muse-module-member-api
- market-server 直接声明 muse-spring-boot-starter-biz-tenant(此前经 member-server 传递,
  收口暴露的隐性传递耦合 → 依赖诚实化)
- 顺带修预存潜伏 test 编译破损:AppMuseMarketPublishControllerTest 的 9 参
  PublishRecordItem 构造(record 自 commit a00c758 加 marketAssetId/appealStatus 变 10 参、
  test 未同步;因 CI 从未在本特性分支运行而潜伏)→补 marketAssetId=null

验收:member-api/member-server/market-server scoped reactor test-compile BUILD SUCCESS;
AccountMarketRecordServiceTest 8/0、MarketAccountProjectionFacadeConfigurationTest 3/0、
MarketAccountProjectionProviderTest 5/0、AppMuseMarketPublishControllerTest 10/0;
BcBoundaryArchTest 1/0(0 Architecture Violation)。同步 bc-boundaries §三 + 台账 §一 TODO。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 14:08:19 -07:00
lili
053caf192f test(contract): openapi-diff 破坏性变更门禁本地实证 + 镜像钉 v1.19.1 + 复现脚本
- go install 同款 oasdiff v1.19.1 验证 openapi-diff.yml 检测逻辑+逐域循环聚合:
  对全部 7 域真实契约 5/5——无变更/新增可选参数/新增端点→放行;
  参数变必填(request-parameter-became-required)/删端点(api-path-removed-without-deprecation)→拦截
- workflow 镜像 tufin/oasdiff 钉 v1.19.1(机械门禁去 :latest 漂移)
- 新增可复现脚本 muse-cloud/scripts/verify-openapi-diff.sh(自举 oasdiff+临时 venv,冷启动 5/5 绿)
- 同步台账 §一②/TODO、contract-first §四(去内联 YAML 双源、指向 workflow SSOT)、knowledge §七
- 残留:GHA 触发管道(PR paths 触发/base.sha worktree/docker 拉取)待真实 PR 首跑

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 13:50:15 -07:00
lili
0cf6a6659e test(p1r): approve remaining api coverage completions 2026-06-17 10:49:58 -07:00
lili
4c16235e09 docs(p1r): sync account verification debt status 2026-06-17 07:59:46 -07:00
lili
467d7184c7 test(p1r): clear remaining content verification debt 2026-06-17 07:58:07 -07:00
lili
94155e6b03 test(p1r): verify content admin task reads 2026-06-17 07:39:01 -07:00
lili
6802dcf115 test(p1r): verify content export task cluster 2026-06-17 05:03:42 -07:00
lili
4e5be1f029 test(p1r): 验收债批25 真实 PG IT(content import-task 簇 2 op:真实只读 + fail-closed) + 台账/.agent 同步
P1rContentImportTaskCompletedApprovalIT(真实 PG muse_p1r_content_import_task_test,
3/3 绿,独立复跑两次均绿)覆盖 getImportTask/createImportTask,经真实
/app-api/muse/import-tasks/{taskId} 与 /works/{id}/import-tasks 入口。

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 写。

content needs_verification 验收债 10→8(余导出 4 + 管理端列表 2 + createParseJob +
mergeBlockSuggestion;含真实只读 getExportTask/管理端列表)。台账 completed flip +
覆盖门禁 APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:59:59 -07:00
lili
c8990fd2d2 test(p1r): 验收债批24 真实 PG IT(content parse-job 生命周期 4 op fail-closed) + 台账/.agent 同步
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} 入口。

AI 解析任务与章节结果投影归 AI owner;单体内 ContentParseJobFacade/
ContentKnowledgeDraftFacade/ContentFileFacade 仅有 fail-closed 默认实现
(全 default = unavailable,@ConditionalOnMissingBean 兜底)。断言:AI owner 不可用时
四 op 全部 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE(解析任务投影在
requireParseJobProjection 处即不可用,故不伪造任务/章节/重试/批量确认结果);
两写 op(retry/batchConfirm)已预占命令随 @Transactional 回滚 0 残留,四 op 全程 0 写;
非法 API version→CONTENT_API_VERSION_UNSUPPORTED 守卫先于服务体且 0 写。

content needs_verification 验收债 14→10(余 10 全为 FileService/New-API/SSE
外部 owner fail-closed:导入/导出/管理端任务/createParseJob/合并建议)。
台账 completed flip + 覆盖门禁 APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:53:20 -07:00
lili
517abbdb2a test(p1r): 验收债批23 真实 PG IT(content chapter-parse-result 决策 2 op fail-closed) + 台账/.agent 同步
P1rContentChapterParseResultDecisionCompletedApprovalIT(真实 PG
muse_p1r_content_import_parse_test,3/3 绿,独立复跑两次均绿)覆盖
confirmChapterParseResult/rejectChapterParseResult,经真实
/app-api/muse/chapter-parse-results/{resultId}/confirm|reject 入口。

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 写。

content needs_verification 验收债 16→14(余 14 全为 FileService/New-API/SSE
外部 owner fail-closed:导入/导出/管理端任务/解析任务/合并建议)。台账 completed flip +
覆盖门禁 APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:46:56 -07:00
lili
22ba9e84c6 test(p1r): 验收债批22 真实 PG IT(content style-check 簇 2 op fail-closed) + 台账/.agent 同步
P1rContentStyleCheckClusterCompletedApprovalIT(真实 PG
muse_p1r_content_style_check_test,3/3 绿,独立复跑两次均绿)覆盖
createStyleCheck/getStyleCheckResult,经真实
/app-api/muse/works/{id}/planning/style-checks* 入口。

风格检查任务生成与结果归 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 写。

content needs_verification 验收债 18→16(余 parse-result confirm/reject 2 +
14 FileService/New-API/SSE 外部 owner fail-closed)。台账 completed flip + 覆盖门禁
APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:39:23 -07:00
lili
a7d6a95824 test(p1r): 验收债批21 真实 PG IT(content meta-projection 簇 3 op fail-closed) + 台账/.agent 同步
P1rContentMetaProjectionClusterCompletedApprovalIT(真实 PG
muse_p1r_content_meta_projection_test,3/3 绿,独立复跑两次均绿)覆盖
listMetaProjections/getMetaProjection/validateDynamicFields,经真实
/app-api/muse/works/{id}/meta-projections* 与 /dynamic-fields/validate 入口。

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 写。

content needs_verification 验收债 21→18(余 createStyleCheck + parse-result
confirm/reject 2 + 约 15 FileService/New-API/SSE 外部 owner fail-closed)。
台账 completed flip + 覆盖门禁 APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:33:57 -07:00
lili
7d3a69ca4d test(p1r): 验收债批20 真实 PG IT(content planning candidate 簇 5 op fail-closed) + 台账/.agent 同步
P1rContentPlanningCandidateClusterCompletedApprovalIT(真实 PG
muse_p1r_content_planning_candidate_test,3/3 绿,独立复跑两次均绿)覆盖
createPlanningCandidate/listPlanningCandidates/getPlanningCandidate/
confirmPlanningCandidate/discardPlanningCandidate,经真实
/app-api/muse/works/{id}/planning/candidates* 入口。

规划候选生成/运行事实/状态投影归 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 写。owner/存在性守卫先于外部调用——
跨属主→CONTENT_FORBIDDEN、缺作品→CONTENT_NOT_FOUND 且 0 写。

content needs_verification 验收债 26→21(余约 15 FileService/New-API/SSE
外部 owner fail-closed + parse-result/dynamic-fields/meta-projection 真实持久化 op)。
台账 completed flip + 覆盖门禁 APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:25:20 -07:00
lili
5d34b3d853 test(p1r): 验收债批19 真实 PG IT(market handoff 簇 4 op,market 验收债清零) + 台账/.agent 同步
P1rMarketHandoffClusterCompletedApprovalIT(真实 PG muse_p1r_market_handoff_test,
3/3 绿,独立复跑两次均绿)覆盖 createBindPrecheck/createMarketplaceHandoff/
getHandoffStatus/cancelHandoff,经真实 /app-api/muse/marketplace handoff 入口端到端:
已购 active 授权快照→来源授权摘要(handoffReady)→一次性 handoff token(明文不入库、
只存 sha256 hash,事件快照不含明文)→只读回显 pending→expectedStatus CAS 取消
(pending→cancelled + completed_at)。bind/handoff 回放幂等返回与首呼一致结果不双写;
cancel 终态后再取消被取消性守卫拒绝(MARKET_HANDOFF_NOT_CANCELLABLE,守卫先于 replay
短路)且 0 写。fail-closed:非法 API version、缺资产、无活跃授权(授权≠可达)、目标
owner 白名单外(LocalMarketTargetOwnerFacade 本地目标页 fail-closed)、跨属主 token
读取/取消(属主隔离 RESOURCE_FORBIDDEN)、取消 CAS 期望态不匹配(reserveCommand 为
Propagation.MANDATORY,预占命令随 @Transactional 回滚 0 残留),失败路径全程 0 写。

至此本战役 market 批15-19 补 14 op,叠加战役前 14 op = market needs_verification
28 op 全有 dedicated 真实 PG 证据,market 验收债清零。台账 completed flip + 覆盖门禁
APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:08:23 -07:00
lili
cb6e5955ba test(p1r): 批18 market 采纳链真实 PG IT(purchaseAsset → installMarketplaceAsset)
P1rMarketLicenseInstallCompletedApprovalIT 经真实 /app-api/muse/marketplace/assets/{id}/
purchase|install 覆盖 purchaseAsset/installMarketplaceAsset(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 写。
真实 PG muse_p1r_market_license_install_test 3/3 绿,独立复跑两次均绿。

market 验收债 6→4(下一簇=createBindPrecheck + handoff 三件套)。同步 docs/mvp/进度总账.md §五B
与 market/.agent。completed 仍由人工批台账。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 01:45:43 -07:00
lili
63ad0c85e6 test(p1r): 批17 marketplace 发现读真实 PG IT(listAssets/recommendations/governanceImpact)
P1rMarketplaceDiscoveryReadsCompletedApprovalIT 经真实 /app-api/muse/marketplace/assets|
recommendations|assets/{id}/governance-impact 覆盖 listMarketplaceAssets/
listMarketplaceRecommendations/getGovernanceImpact(MarketAssetQueryServiceImpl + 收藏/命令依赖,
base-package=cn.iocoder.muse.module)。断言:列表按 App 可见性(listed 公开;draft 等非公开仅 publisher
自见)+ assetType 过滤分页 + 卡片字段回填(publisherName/version=unknown/isFavorite/isAcquired/
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 快照零变更)。真实 PG muse_p1r_marketplace_discovery_test 4/4 绿,独立复跑两次均绿。

market 验收债 9→6(下一簇=采纳链 createBindPrecheck/purchaseAsset/installMarketplaceAsset)。
同步 docs/mvp/进度总账.md §五B 与 market/.agent。completed 仍由人工批台账。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 01:30:56 -07:00
lili
482fb31e14 test(p1r): 批16 market 管理端资产治理写真实 PG IT(preview→delist/recall)
P1rMarketGovernanceWriteCompletedApprovalIT 经真实 /admin-api/muse/market/assets/{id}/
governance-impact|delist|recall 覆盖 adminPreviewGovernanceImpact/adminDelistAsset/adminRecallAsset
(同 批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 写。真实 PG muse_p1r_market_governance_test 4/4 绿,独立复跑两次均绿。

market 验收债 12→9(下一簇=marketplace 发现读)。同步 docs/mvp/进度总账.md §五B 与 market/.agent。
completed 仍由人工批台账。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 01:19:30 -07:00