lili
99a118b45a
docs(进度总账): 订正 market-publish e2e fail 真根因为前端写后读慢一拍
...
深度诊断推翻此前"无排序"误判:page.request 证后端提交后立即可见且已倒序,
真根因是前端 React Query refetch 拿提交前快照;系统排除浏览器缓存/SW/后端延迟。
后端排序作为附带真 UX 改进已修(d8ed40d),前端慢一拍属 market 工作线专项。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 11:46:15 -07:00
lili
d8ed40dc4d
feat(market): 我的发布记录按发生时间统一倒序
...
PublishRecordItem 加 occurredAt(草稿=createTime/申请=submittedAt),
listMyPublishRecords 合并 draft+request 后按 occurredAt 倒序(nullsLast),
对齐 market 其它列表 orderByDesc;前端 MyPublishRecord 同步 occurredAt 契约。
验证:market 模块 test 绿(mock 时间 null,nullsLast 稳定保序不破坏断言)、
前端 tsc+vitest 绿、page.request 真后端直查证列表倒序生效(最新在首页)。
注:market-publish:65 e2e 仍 fail,真根因是前端提交后列表写后读慢一拍
(非排序,详见进度总账),属 market 工作线专项。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 11:44:21 -07:00
lili
a1a7cd8379
docs(进度总账): #30 盘点收口 - D/E/F/G 为可验证缺口全集
...
Explore 发现的 style-check/export/import/job-cancel 经后端核实均
外部依赖 fail-closed(*Facade UNAVAILABLE)或无自然 UI 落点,非可端到端验证缺口。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:55:38 -07:00
lili
be392157cb
docs(进度总账): 回写 studio G 已安装 KB 停用/恢复 + 全量 e2e 35/1
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:46:01 -07:00
lili
d4c530524e
feat(studio): 已安装知识库停用/恢复 UI(G)
...
- useInstalledKnowledgeDisable/Restore hook(POST installed-knowledge-bases/{installId}/disable|restore,CommandReqVO 仅 commandId)
- KnowledgePage「从市场安装的」卡片:按 binding_status 切换停用/恢复按钮,保留卸载
- mock + vitest(installed disable/restore status 翻转)
- e2e 真后端(muse_knowledge_binding.binding_status 切换;global-setup section10 复位 binding id=1)
#30 第4缺口。验证:vitest 6/6+全套79/79、tsc/eslint 0、e2e 1 passed(真后端)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:42:27 -07:00
lili
50353b3717
docs(进度总账): 补充 market-publish 倒序修法(PublishRecordItem 缺时间字段)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:29:42 -07:00
lili
fb86588265
docs(进度总账): work-schema-binding flaky 已修 + market-publish 列表倒序 known issue
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:26:25 -07:00
lili
fa651682b4
test(studio): work-schema-binding e2e 修 flaky(waitForResponse 前置)
...
schema-options 由 CreateWorkModal(首页即挂载、staleTime 60s)预取,全量跑(后端热)请求常
早于 waitForResponse 注册→race→30s timeout;注册移到 goto 前,覆盖请求早发/晚发两种时机。
全量 e2e 复跑该 spec 转绿(单跑本就绿、仅全量 flaky)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:20:28 -07:00
lili
6173889bd3
docs(进度总账): 回写 studio D/E/F 三缺口 + planning 二次保存 500 修复
...
D Block 分割合并 / E 正文来源归因 / F 知识库停用恢复(均真后端 e2e 真跑);
planning-edit save 500 根因(逻辑删除+uk 不含 deleted→二次保存撞键)与物理删除修复;
全量 e2e 34 passed/1 flaky(work-schema-binding)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:12:55 -07:00
lili
a9323adb13
fix(content): planning 字段快照物理删除,修二次保存重复键 500
...
captureFieldSnapshot 的 deleteBySectionId 原走 MyBatis-Plus 逻辑删除(@TableLogic):
被删物理行(deleted=TRUE)仍占唯一约束 uk(tenant_id,section_id,field_key)(不含 deleted),
用户二次保存同 section 字段时 INSERT 撞键→DuplicateKeyException→规划保存 500。
改原生 @Delete 物理清行,根治幂等(快照是可重建派生数据,物理删除无审计损失)。
根因:全量 e2e 暴露 planning-edit save 500(work-schema-binding 为并发 flaky,单跑绿)。
验证:planning-edit e2e 真后端 1 passed;连续 2 次 save 同 section code=0(rev 3→4,旧 jar 第 2 次必 500)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:09:07 -07:00
lili
494f3b5fd6
feat(studio): 知识库停用/恢复 UI + e2e 真跑
...
F——补自建知识库停用/恢复端面(后端 disable/restore 端点已有,缺 UI):
- useKnowledge: useKnowledgeDisable/useKnowledgeRestore mutation hook
- KnowledgePage: 自建 KB 卡片按 status 切换「停用」(confirm)/「恢复」按钮
- mock: 补 restore handler(disable 已有)
- 核实真后端 SummaryRespVO.processingStatus = kb.getStatus(),启用状态(disabled/searchable)
经其透出可观测,排除"RespVO 缺启用状态字段"误判,确认无需改后端
- vitest useKnowledge 5/5(disable→disabled→restore→active)+ 全套 78/78,tsc/eslint 0
- e2e knowledge-disable-restore 真后端 1 passed;global-setup section 9 复位 KB1 status='draft'
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 09:42:29 -07:00
lili
cc57c595d8
feat(studio): E 来源归因查看 - 数据层+UI+e2e 真跑[P1]
...
studio 缺 UI 端面补齐(第 2 个,可验证缺口)。openapi export SourceAttribution;useSourceAttribution hook(只读);content mock source-attribution handler;SourceAttributionPanel(来源类型/贡献中文标签+许可+谱系);WorkspacePage 右侧加「来源」Tab(block 级,需 activeBlock)。
验证:useSourceAttribution 2/2 + SourceAttributionPanel 2/2 + 全套 vitest 77/77(无回归) + tsc 0 + eslint 0 + playwright source-attribution 1 passed(真后端 user_original→用户原创)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 09:11:28 -07:00
lili
c76cdec60a
test(studio): D-c block 分割/合并 e2e 真跑 + 幂等复位[P1]
...
- block-structure.spec.ts:真后端端到端——进 work1 workspace→章节结构条(1 小节)→分割(真实 split POST 200→2 小节)→合并(真实 merge POST 200→1 小节);'N 个小节'来自 chapterDetail 真数据,证明 split 真产生 block。
- global-setup section 8:幂等复位 work1 chapter1 为单 Block(删 split 残留,保留 order_no 最小首 Block)。
- BlockStructureBar.extractText 兼容纯文本 content(基础种子 block content 为纯文本非 ProseMirror JSON,JSON.parse 失败时退回原串,使 split 可用)。
验证:playwright block-structure 1 passed(真后端活体) + eslint 0。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 09:01:11 -07:00
lili
af781163a9
feat(studio): D-b block 分割/合并 UI - 章节内多 Block 切换 + 结构条[P1]
...
- BlockStructureBar:章节内多 Block 列表(选中编辑/分割/与下合并),分割取正文中点 splitPosition,乐观锁用 block revision(blockRevision helper 兼容真后端 revision 与 openapi version 字段漂移)。
- WorkspacePage 集成:activeBlock 从 blocks[0]→用户选(activeBlockId);编辑器区上方挂 BlockStructureBar;MuseEditor 本体不动(低回归)。
验证:全套 vitest 73/73(无回归,+7) + tsc 0 + eslint 0。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 08:55:15 -07:00
lili
d0ea9479f1
feat(studio): D-a block 分割/合并数据层 - hook + mock + vitest[P1]
...
studio 缺 UI 端面补齐(用户选 Block 分割合并)。openapi export SplitBlock/MergeBlockRequest(Result 手写:OpenAPI 误声明 response content:never,后端注解缺失);useBlockStructure(useSplitBlock+useMergeBlock,onSuccess 失效 chapterDetail+chapterList);content mock split/merge handler(单 block 模型简化,校验乐观锁返回契约 block);useBlockStructure.test 3/3。
验证:vitest 3/3 + tsc 0 + eslint 0。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 08:48:19 -07:00
lili
acf4f0a8d6
docs(p1r): B5+projection 端到端真实验证回写总账[P1]
...
B 落地链 ①②③④⑤+projection 缺环全部完成并端到端真实验证(playwright planning-edit 真跑+直查 DB 快照落库)。剩 ⑥D3 非 draft preview 全4端点解阻(独立大块)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 04:51:34 -07:00
lili
355cdec314
test(studio): B5 planning 编辑器 e2e 真跑 + meta-schema fixture[P1]
...
- global-setup.ts 种 2 个 active MetaSchema(setting/worldview,novel_work)+字段+版本级可见性+绑 work1(此前 muse_slice_live 无 active schema→meta-projection unavailable)。
- planning-edit.spec.ts:真后端端到端——进 work1 workspace→作品规划 Tab→meta-projections 真实返回 setting→选 setting 渲染字段→填 time_period→PUT /planning/setting(验 usedFieldKeys 含 time_period+content)→切回验 value 回填。
验证:playwright planning-edit 1 passed + 直查 DB 确认 captureFieldSnapshot 真落库(muse_content_planning_field_snapshot 有 time_period/schema_id=1 行、planning section content_payload={time_period:古代})。B 字段级链路端到端真实贯通。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 04:50:08 -07:00
lili
9b7efbb135
feat(meta,content): meta-projection 投影实现补 B 缺环[P1]
...
补齐 B5 前端 PlanningEditor 依赖的 meta-projection 真实化(此前 ContentMetaFacade 仅 unavailable stub):
- meta-api 新增 MetaProjectionQueryApi + MetaSchemaProjectionDTO + MetaProjectionFieldDTO(projectionKey≡schemaKey)。
- meta-server MetaProjectionQueryApiImpl(@Service):schemaId→activeVersionId→MetaFieldDO 字段+MetaVisibilityPolicyDO 版本级可见性,policy 缺失兜底可见可编辑,enumValues JSON 解析。
- content RealContentMetaFacade(@Service 替换 Unavailable):work targetType 匹配多 active schema 列投影,经 meta-api 拿字段+可见性,读本域 planning 按 fieldKey 回填 value,fail-closed;validate 暂 default(B5 走 PUT planning 后端校验)。
验证:MetaProjectionQueryApiImplTest 4/4、RealContentMetaFacadeTest 5/5、BcBoundaryArchTest 2/2(0 跨 BC 违例)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 04:37:04 -07:00
lili
d8cb1047da
docs(p1r): meta-projection 投影实现评审版 + 缺环回写总账[P1]
...
- 新增评审版:projectionKey≡schemaKey、列表=work targetType 匹配多 schema(人类第四轮+评审走查决策)、RealContentMetaFacade 置 content-server 调 meta-api+回填本域 planning value、可见性起步版本级;含 design-docs SSOT 约束、关键决策表、边界数据流、blast/风险/验收/open items。
- execution 总账回写 B5c 前端完成 + projection 缺环发现(ContentMetaFacade 真后端 unavailable,e2e 实为真后端活体)+ 第四轮决策。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 04:24:03 -07:00
lili
53fb2076bc
feat(studio): B5c-1 planning 编辑器集成 WorkspacePage[P1]
...
- PlanningEditorPanel.tsx:列 work 的 meta-projection→选→内嵌 PlanningEditor;真后端 Meta owner 未接入投影时优雅降级(空态提示不崩,anti-false-green 不假装有字段)。
- WorkspacePage.tsx:右侧面板 Tab 化(AI 创作助手/作品规划);planning 为 work 级不依赖 activeBlock 故面板始终挂载;AI tab 保持原 activeBlock 挂载语义+空态提示。
验证:vitest PlanningEditorPanel 2/2(列 projection 默认渲染字段、unavailable server.use override 降级)、全量 66/66、tsc 0、eslint clean。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 04:14:08 -07:00
lili
985a7ac0d8
feat(studio): B5b planning 编辑器组件 + 修复 vitest jsx runtime[P1]
...
- PlanningEditor.tsx:按 projection.fieldType 动态渲染(enum→select/number→number/boolean→checkbox/text→textarea);edits-diff pattern(字段值=编辑优先否则已存值,避免 effect setState 级联渲染);保存收集有值字段为 content+usedFieldKeys,成功清编辑。
- vite.config.ts:esbuild.jsx='automatic'。修复 vitest 默认 classic jsx runtime(需 React in scope)与生产 plugin-react/tsconfig react-jsx 不一致——此前仅 renderHook 测试未暴露,PlanningEditor 首个 render 组件测试触发 'React is not defined'。
验证:vitest PlanningEditor 2/2、全量 64/64、eslint clean、tsc 0 error。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 02:53:22 -07:00
lili
e7616fc511
feat(studio): B5a planning 编辑器数据层 - hook + mock + vitest[P1]
...
B5(从零建 planning 编辑器,让 Planning 字段级数据真实化)数据层:
- usePlanning.ts:usePlanning/useMetaProjections/useMetaProjection/useSavePlanningItem/useValidateDynamicFields。SavePlanningItemDto 内联(openapi 生成 content 为 Record<string,never> 无法承载 fieldKey→value,且缺 usedFieldKeys)。
- openapi.ts 导出 PlanningStructure/MetaProjectionDetail 等;content.ts mock 加 planning+meta-projections+validate handler(PROJECTION_DEFS 固定 schema 字段,保存记录 content+usedFieldKeys,详情回填 value)。
验证:vitest usePlanning 4/4(拉投影→保存 content+usedFieldKeys→回填 value 数据流)、tsc 0 error。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 02:44:27 -07:00
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
b615a70a44
fix(studio): work 创建补 commandId + D1 work-schema e2e 真跑[P1]
...
D1-4 e2e 真跑暴露既有缺陷:useWorkCreate 漏传 commandId(后端 @NotBlank),真实后端 400(vitest mock 不校验故长期潜伏,work 创建此前无真实 e2e)。补 crypto.randomUUID() 幂等键。
新增 work-schema-binding.spec.ts 端到端验证 D1 链路:真实 GET /works/schema-options 200 渲染 Schema 下拉 → 真实 POST /works 200 + workSchemaId 字段贯通前后端。
验证:e2e 1 passed(真实后端,新 jar 含 D1-1/2/3);vitest useWorks 6/6 不破。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 01:09:51 -07:00
lili
1dc1c3af2b
feat(studio): D1-4 work 创建选 Meta Schema(前端)+ vitest[P1]
...
D1 落地链前端环:CreateWorkModal 加作品结构 Schema 下拉(useSchemaOptions 拉 /works/schema-options),创建时 schemaId 转 number 传 POST /works(后端可信边界校验 active 后写 workSchemaId)。可选:不选则不绑定(workSchemaId null,影响预览 no-source 排除)。msw mock 加 schema-options handler + POST /works 回写 workSchemaId。
验证:vitest useWorks 6/6(+useSchemaOptions/+createWork schemaId)、tsc 0 error。e2e 真跑待重建 jar(含 D1 后端端点)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 01:01:16 -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
6389d463f3
docs(meta): 固化 meta-schema 用量投影 4 项决策(M全量/D1 work绑定/D2 快照表/D3 全4端点)
...
人类 2026-06-20 第二轮拍板:坚持全量;D1 schema_key 来源=激活 WorkDO.workSchemaId 绑定(→MetaSchemaDO.id + planning schemaVersion,历史 no-source 排除);D2=补每实例快照表;D3=扩非 draft preview 解阻全 4 治理端点。覆盖 execution v0.2 原推荐,写回决策基线 + §九 决议,为分阶段实现对齐。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 23:38:27 -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
cfb7eccd0c
docs(进度): 同步 7 项 studio UI 缺口补全(知识动作/图谱CRUD/发布预检·市场许可/handoff预检·个人中心记录)
...
本轮自主补全 7 项真实 studio UI 缺口(均 UI+hook+vitest+e2e 真后端验证):知识(草稿忽略/recheck、图谱实体编辑/新建关系、发布可发布性预检诚实 blocked)、市场(资产许可详情/收藏、绑定到作品授权预检)、个人中心(发布记录补齐三件套)。
e2e 22→30 用例本地活体全绿;总览据实更新各模块前端状态,待办由「高/0 UI」收敛为「部分完成」并列明剩余缺口。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:50:42 -07:00
lili
f760ee6043
feat(knowledge): studio 知识库发布到市场可发布性预检(诚实呈现受阻)+ e2e
...
P1 真缺口补全(7/7,收官):知识库工作台自建库新增「发布」入口——源侧 publish-prechecks 预检。useKBPublishReadiness→POST /knowledge-bases/{kbId}/publish-prechecks(commandId+version);KnowledgePublishModal 打开即预检,呈现 blocked+受阻原因+权利/隐私/处理三态;KnowledgePage 自建 KB 卡片加「发布」按钮。
诚实处理:平台外部权利隐私校验器未配置(EXTERNAL_RIGHTS_PRIVACY_VALIDATOR_NOT_CONFIGURED)→ precheck 恒 blocked,UI 如实呈现「暂不可发布」+受阻原因,不伪造可发布、不提供伪造确认入口。
顺带修真后端兼容 bug:normalizeKnowledgeBase/normalizeInstalledKnowledgeBase 的 kbId 未强转字符串,真后端数字 id 被 isKnowledgeBaseSummary 守卫全部过滤→KB 列表空(此前仅 mock 测过未暴露);改 String() 强转(对字符串幂等,不破坏 mock)。
验证:vitest knowledge 13/13(加 publish-precheck 契约)、tsc 0 错;新增 e2e knowledge-publish-precheck.spec.ts 真后端绿(发布→预检 200+blocked:true+「暂不可发布」),全量 30/30 无回归。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:48:14 -07:00
lili
3dff0e1735
feat(account): studio 个人中心补齐市场记录三件套之三「我的发布」+ e2e
...
P3 真缺口补全(6/7):PersonalCenter 此前只有购买记录+授权记录,缺发布记录(账户台账视角)——补齐三件套对称。useAccountPublishRecords→GET /account/publish-records(AppPublishRecordRespVO:reviewStatus/marketStatus/blockingReason);PersonalCenter 加「我的发布」区。
查重结论:不与 market 模块 useMyPublishRecords 重复——后者是发布工作流操作台(草稿/提交/申诉,my-publish-records),本接口是账户中心历史台账(account/publish-records,member 模块,与购买/授权并列)。
验证:vitest account 3/3(加 publish-records URL+reviewStatus 契约)、tsc 0 错;新增 e2e account-publish-records.spec.ts 真后端绿(GET 200+「我的发布」渲染),全量 29/29 无回归。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:36:20 -07:00
lili
9c84c05e62
feat(market): studio 资产详情页加「绑定到作品授权预检」(来源侧 handoff 预检) + e2e
...
P2 真缺口补全(5/7):资产详情页新增「绑定到作品」区——获取授权 + 来源侧 bind-precheck(展示授权摘要/兼容性/就绪态/绑定策略)。useBindPrecheck→POST /assets/{id}/bind-precheck(targetOwner=knowledge/targetAction=bind/targetWorkId,commandId 走 body);详情页接 useAcquireMarketAsset 获取授权 + 预检结果回显。
诚实边界:只做来源侧只读预检(返回授权摘要,不产生绑定事实);完整交接 token 由知识域消费(Market 不消费 token),消费端 UI 不在本切片——故不做 create handoff token(避免一侧设计)。
反假绿:probe 真后端确认链路——bind-precheck 需先 acquire(否则 1044000006 授权不存在);asset 须 listed(asset 2 not_listed→1044000004);agent 资产 targetOwner=knowledge/action=bind 通(ai/install 报 1044000021 模板不支持)。
验证:vitest market 4/4(加 bind-precheck URL+body 契约)、tsc 0 错;新增 e2e market-handoff-precheck.spec.ts 真后端绿(acquire→预检→handoffReady:true),全量 28/28 无回归。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:31:27 -07:00
lili
7a16d19211
feat(market): studio 资产许可详情页(详情+许可条款+收藏)接通真后端 + e2e
...
P2 真缺口补全(4/7):列表页仅 licenseSummary 单行,新增资产详情页呈现完整许可——路由 /market/assets/:assetId + MarketAssetDetailPage;useMarketAssetDetail→GET /marketplace/assets/{id}(licenseInfo:类型/价格/有效期/允许·禁止用途);useFavoriteAsset→POST favorite;MarketBrowse 资产名改为详情 Link 入口。
反假绿:favorite 首跑返 1044000001(MARKET_COMMAND_ID_REQUIRED)——查出 favorite 的 commandId 走 X-Command-Id 请求头(market 端点契约,异于 acquire/install 的 body commandId),改用底层 request 注入该头修复。
验证:vitest 53/53(market contract 加 detail/favorite URL)、tsc 0 错;新增 e2e market-asset-detail.spec.ts 真后端绿(列表→详情→许可渲染→收藏 POST code:0),全量 27/27 无回归。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:21:45 -07:00
lili
c119b90919
feat(knowledge): studio 图谱实体编辑 + 新建关系接通真后端 + e2e
...
P1 真缺口补全(3/7,价值最高):KnowledgeGraphPanel 从只读→可维护正式轨——useUpdateEntity→PUT /entities/{id}(编辑实体名,经后端 normalizedName 规范化)、useCreateRelation→POST /entities/{id}/relations(源→目标 + relationType);均带 commandId,graph node.id=实体 id 直接复用。UI:每实体 inline 编辑 + 底部源/目标/类型新建关系表单。
验证:vitest 52/52(contract 加 PUT/POST URL+body+targetEntityId 转 number)、tsc 0 错;新增 e2e knowledge-entity-crud.spec.ts 2 例真后端绿(编辑名回显规范化值、建关系回显新边),全量 26/26 无回归。反假绿:编辑回显失败暴露后端 normalizedName 去连字符规范化,e2e 适配真实规范化用稳定值断言、非掩盖。种子:global-setup #2c work2 三实体(与 graph 的 work1 隔离、按 description marker 复位)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:13:20 -07:00
lili
e5ee1fdb58
feat(knowledge): studio 草稿「忽略/重新校验」接通真后端 + e2e
...
P1 真缺口补全(2/7):KnowledgeDraftPanel 在「确认入库」旁加「重新校验」「忽略」两动作,接已就绪后端端点——useIgnoreKnowledgeDraft→POST /knowledge-drafts/{id}/ignore(审而不入,草稿转 ignored 移出)、useRecheckKnowledgeDraft→POST /knowledge-drafts/{id}/recheck(来源重验异步任务,草稿留 pending);均带 commandId 幂等键,照 useConfirmKnowledgeDraft 模式。
验证:vitest 51/51(contract test 加 ignore/recheck URL+commandId 断言)、tsc 0 错;新增 e2e knowledge-draft-actions.spec.ts 2 例真后端绿(recheck→queued、ignore→ignored+移出),全量 e2e 24/24 无回归。种子:global-setup #2b 固化 work2 下 recheck-e2e/ignore-e2e 两草稿(与 confirm 的 work1 隔离、各用独立草稿避免 recheck 改态影响 ignore)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 19:59:40 -07:00
lili
3a0cb1d73a
docs(进度): 纠正总览 5 处 AI 候选链过时记录(P0 已完成)
...
核查确证 P0(AI 候选采纳链 UI)已于 2026-06-14 MVP#1 完成:WorkspacePage 五环节(生成→SSE→Diff→采纳→回显)真接通(useAcceptSuggestion→真 suggestion-merges)、e2e accept-suggestion 2/2 绿、后端「审」字段 MuseAiCandidateReviewService+setSourceStatus(active) 同日已补。
总览原 5 处(line 15/20/23/74/151)仍记「AI 候选链断/studio 从不调」,与进度总账 line 160「✅ AI 候选采纳 rendered UI 活体证」自相矛盾→纠正为 ✅ ,两台账一致。EditorPage 为废弃演示页(故意不接,非缺口);真实 AI 生成依 New-API 属 scope 外。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 19:39:23 -07:00
lili
99f8fcd2e0
test(e2e): 全量 e2e 9 spec/22 用例本地活体全绿 + binding 种子固化
...
PG 宿主 100.64.0.8 恢复在线→查出旧 jar(Jun-19 00:59)缺 GET bindings 端点(commit 3a7a72f Jun-19 13:30)致 405→rebuild Jun-20 新 jar(反假绿:不用过时 jar)→起栈 48080(local,infra,清 socks)→playwright 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 红故无就地修。回写进度总账 §五C + 总览待办(受阻→完成) + spec 注释。附本会话 ce-brainstorm/ce-plan 产出文档。
诚实边界:本地全栈活体(rebuild jar + 真 PG muse_slice_live),非 CI(maven.yml 不跑 e2e/需活体后端+浏览器)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 13:53:29 -07:00
lili
349cd73119
docs(dev-baseline): 交叉引用格式示例占位符去 .md,全仓 0 断链
...
格式示例 `[文档名](文件名.md)` 的占位符被断链扫描误判为断链;改为 `相对路径`(呼应下一行'引用链接使用相对路径'),语义不变,消除最后 1 条断链。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 10:26:18 -07:00
lili
40d4bdb527
docs(design-docs): 清理对从未创建的 doc/dev/* 的全部引用(消除幽灵权威归属)
...
断链扫描发现 design-docs 把整套 doc/dev/00..09(路线图/阶段/IA验收门禁/真实现状差距)当 SSOT/门禁权威反复引用约 16 处,但该套文档 git 全历史从未创建 → 读者按图索骥全 404。职责实已被现有文档承担,逐处改指或墓碑标注:路线图/阶段→进度总账;验收门禁→覆盖 JSON+verification 规则;真实现状差距→项目功能与进度总览;产品形态→产品/架构分册;RAGFlow 落地→muse-module-knowledge。
改动:00-文档大纲(SSOT归属/角色导航再读列断链/专题-03描述/职责表/单一归属 共5处 + v6→v7);内容映射表(dev路线图块/产品形态行/个人中心/Sa-Token/IA-0~3门禁/IA gate 共~11处 + v6→v7);架构-03 ADR(参考落地2处 + v9→v10)。
验证:断链扫描 3→1(唯一剩 dev-baseline 历史区格式占位符,无害);design-docs 残留 doc/dev 仅墓碑文字标注,0 可点击断链。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 09:38:12 -07:00
lili
329db944ff
docs: 进度口径收敛到机械唯一源——修正三套矛盾数字(147/100→233/233) + 现状基线降级
...
排查发现进度数字三套互相矛盾:总览/现状基线/主台账历史段=147/86、agent-specs=100/127、module-reality=233/0。核机械真值:覆盖 JSON summary=233/233 completed/0 needs(每 op 带 testFiles 证据 + P1rApiCoverageReportTest 校验 summary 自算防手工拨)。⚠️ JSON generatedAt=2026-05-25 未随内容刷新(手工维护痕迹),已在文档标注以 summary+testFiles 为准。
修正:① 总览(我上轮新建,误抄过时台账)147/233→233/233、各域 full、接口门≠端到端两口径分清、定位为人读封面(权威以台账/JSON为准);② 主台账 头部加机械源口径声明(233/0)+门禁中→满+验收债标已清零;③ 现状基线降级为 2026-06-13 历史快照(顶部时效横幅+性质去SSOT);④ AGENTS序2/module-reality 改引用;⑤ agent-specs/.agent 注记历史数字;⑥ meta-schema review 回指 execution v0.2 已证伪地基(待决策提案);⑦ design-docs/00 加'设计≠进度';⑧ dev-baseline 申明旧 SSOT 自称失效。
确立单一真实源:设计=design-docs;进度=进度总账(叙述)+覆盖JSON(机械);人读=项目功能与进度总览(封面)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 05:32:32 -07:00
lili
0c119d7c6f
docs: 归档已完成阶段过程文档至 docs/archive(git mv 保历史)
...
9 篇工作已完成的过程文档(P1R解锁3篇+agent基建交付+superpowers报告2篇+P1R任务memory+已合并object-storage计划+已折入总览的completion brainstorm)移至 docs/archive/。保留:design-docs(SSOT)、主台账、现状基线、对抗复盘/P0冻结令(知识网根基,被AGENTS/.agents/台账引用)、meta-schema当前2篇、p1r-api-coverage.json(被引数据)、memorys/README。归档非删除,git 可恢复。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 02:50:00 -07:00
lili
73ec83ab20
docs: 新增项目功能与进度总览(人读全局入口) + AGENTS 任务前必读指针
...
合成自 design-docs 功能规范 + 主台账/现状基线/.agent/git:看板(整体~76%、后端~80%、前端studio~30%、覆盖门147/233) + 模块进度表 + 功能清单×状态(7域~64功能) + 待办表(按优先级+阻塞原因) + 文档地图。AGENTS 任务前必读加序0指针。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 02:50:00 -07:00
lili
3adf0172d2
docs(spec): meta-schema 执行版 v0.2(5-persona 评审修订:地基不存在,证伪 4 前提)
...
ce-doc-review 5 persona + 自验 grep 证伪 v0.1 依赖的 grounding:① compatibility() 只算 type_changed、移除字段被 draftField!=null 守卫掉、无可见性比对→破坏字段集无生产者(P0,4票);② workSchemaId 死代码+content 无 schemaKey+ContentMetaFacade 无解析器→schema_key 无来源(P0,3票);③ 可见性版本级仅存 JSON 快照;④ contentPayload key≠fieldKey。外加 preview 仅 draft 版(3端点不解阻)、@Primary @Service 去 ConditionalOnMissingBean、preview 陈旧、DTO→VO 映射缺、Export 须 meta-server、VERIFIED_ZERO 须机械化断言。新增 §四.0 地基层 + P0a 阶段,解阻锚定 publish,扩 open items。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 00:33:22 -07:00
lili
60586115e3
docs(spec): meta-schema 用量投影执行版(决策确认全5维度+字段级+全真实) + 评审版决策记录
...
据 grounding(2026-06-20)对 5 维度定性:Planning 真实字段级消费者(字段用量隐含 contentPayload,补 schema_key 即可,无需新快照表);Work/KnowledgeProjection 实证零 schema→已验证真实0贡献者;AIContext/Export 消费侧零持久化→P3 定性。架构:Meta 算破坏字段集 + 各 BC 贡献者只查本域计数(守 BC 边界),聚合器 all-real 门。含 Flyway 迁移/回填/分阶段/每维度真实 PG IT/回滚。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 00:18:30 -07:00