28 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
984c6db583 test(p1r): require coverage evidence test files 2026-06-19 02:38:29 -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
0cf6a6659e test(p1r): approve remaining api coverage completions 2026-06-17 10:49:58 -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
e181669197 chore(agent-infra): 建立 agent 开发基建、清理历史 churn 并以 BC 违例整改验证
本会话三部分交付,均经 JDK21 真实构建验证(非退出码,读 BUILD SUCCESS + Tests run):

1) Agent 开发基建(机械门禁优先)
- 入口与中枢:AGENTS.md、.agents/{knowledge,rules,skills,workflows}、CLAUDE.md 订正
- 订正 .gitignore:移除对 .agent/.agents 的忽略——它们是版本化 agent 基建,须入库(此前被忽略致克隆即缺)
- 机械门禁:CI 真跑测试(maven.yml JDK21、去 -Dmaven.test.skip)、覆盖台账去硬编码、
  BC 边界 ArchUnit 门(BcBoundaryArchTest)、契约先行门(ContractFirstGateTest:Flyway 卫生 + OpenAPI 结构)
- 单一进度源 docs/mvp/进度总账.md + 7 个 BC per-module .agent + mise.toml(锁 JDK21)
- P1 增量:AiSuggestionMergeProjectionFacade(Gap A)、ContentSourceServiceImpl 事务化 outbox 回流(Gap B)

2) 过期历史文档清理(97 份 churn,git 可恢复)
- 删 docs/memorys(34)、agent-specs 审阅/执行版+迁移review(34)、superpowers/plans+specs(25)、
  design-docs/临时+memorys(4);保留 superpowers/reports/coverage(门禁依赖)
- 唯一干货蒸馏入 .agents/knowledge/external-deps-and-gotchas.md;订正大纲/映射表/基线悬空引用

3) P1 harness 验证:消除已登记 BC 违例 ContentMuseWorkOwnerFacade
- content-api 新增只读端口 MuseContentWorkOwnerApi + content-server 实现(读自有 DAL);
  AI 适配器改消费该端口、移除全部 content.dal 依赖,AI 业务规则与 4 消费者不变
- 删除 ArchUnit 豁免 → 门禁收紧(反向红 31 例 / 正向绿;适配器单测 13/0F、端口实现 7/0F)

注:muse-studio/src(SSE 相关 4 文件)与 muse-module-ai/pom.xml(移除孤儿 contract-server)
为本会话之前已存在的未提交改动,非本次工作,未纳入本提交。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 04:38:07 -07:00
zizi
f84c18fbfb test(p1r): 收口 Content 事件传播真实链路门禁
补齐 Content focused tests、P1R mixed gates、Flyway _test、dependency gate 与 evidence memory,证明 P1R-7f 只推进到 needs_verification,不代表 completed。
2026-06-08 23:17:54 +08:00
zizi
6f5b9b3469 feat(p1r): 接入 Content 事件传播真实链路
将 saveBlock 首次成功后的 active source attribution 写入 Content 本域 outbox,并通过默认关闭的 worker 发布 Events notification/source_status_change。V21 增加 outbox 表、幂等约束、active-only check 与 claim/retry/dead-letter 状态字段。
2026-06-08 23:17:41 +08:00
zizi
165579521a feat(p1r): 落地 Events SSE 真实 API 2026-06-05 22:20:48 +08:00
zizi
4f38bf0da1 feat(p1r): 实现 AI 真实 API dedicated gate
将 P1R-4 AI 41 个 operation 推进到 dedicated / needs_verification,退役 AI contract fallback,并补齐 runtime、SSE、job、audit、source、coverage 与 PostgreSQL/Flyway 门禁。

保留 completedOperations=0;真实 New-API chat、Security owner、Knowledge/RAGFlow、Market 和统一 events 仍留在后续验收。
2026-06-01 00:37:29 +08:00
zizi
3230382d0f feat(p1r): 推进 Content 真实 API 收口
将 Content 域 51 个 operation 从合同兜底推进到 dedicated / needs_verification,补齐专用 Controller、Application Service、DTO、持久化、facade 边界、幂等、审计和阶段门禁。

同时保留 P1R-1 口径:当前不宣称 completed,后续仍需真实外部 owner 和集成验收推进。
2026-05-27 02:24:48 +08:00
zizi
3544a6d4b3 feat(muse-cloud): 补齐 Muse P1 API 合同入口 2026-05-25 01:36:19 +08:00
zizi
43d6806434 feat(muse-cloud): 纳入主仓库并搭建 P1 后端基座 2026-05-24 23:15:08 +08:00