17 Commits

Author SHA1 Message Date
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
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
6802dcf115 test(p1r): verify content export task cluster 2026-06-17 05:03:42 -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