lili
1686843e71
docs(进度总账): admin+studio 缺口盘点 + D 类正文保存 e2e 闭环 + AI 四重阻塞定位
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 07:05:40 -07:00
lili
a581fec913
fix(studio): 正文保存补真后端 e2e + 修 block/work revision 字段漂移(D 类反假绿)
...
D 类(缺口盘点最高优先):正文自动保存是写作台心脏却零 e2e、仅 MSW 掩盖。补
block-autosave.spec.ts 真打 PUT /works/{id}/blocks/{id} 暴露并修真 bug:
- block revision 漂移:WorkspacePage 裸读 activeBlock.version(真后端返 revision、无 version)
→ expectedRevision 恒为 1 → 真后端乐观锁必冲突(1041000002,curl 实证)。提 blockRevision()
到 useBlockStructure 共享、WorkspacePage 复用。
- work revision 漂移(tsc -b 增量重检暴露):WorkVO 类型无 revision、真后端 detail 返 revision,
chapter create/work delete 裸读致 TS 报错。加 workRevision() helper。
- MuseEditor saveBlock 返回 { revision }(非 openapi 标的 newVersion),L110 改 revision 优先兜底。
- market 申诉 deadline fixture 老化(纯时间推进、非代码):reviewedAt+7天过期致提交被拒
1044000027,globalSetup 刷新被驳回 request.reviewed_at 到近期。
验证:block-autosave + block-structure/chapter/work 回归 4/4 绿;全量 e2e 44/0;tsc/eslint/vitest 79/79。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 07:02:13 -07:00
lili
d59fdab9b2
docs(进度总账): V27 验证结论——13 业务键 uk 当前无删除入口、不触发,V27 不做 + 潜伏 checklist
...
Explore 全量 + 抽验确认 meta/ai/knowledge 这 13 表当前无删除 service/controller 入口,
软删 uk 漏 deleted 仅在"删除→重建同 key"时触发,无删除即不触发。区别于 content
chapter/block(有软删、必触发、已 V26 修)。记潜伏 checklist:未来加删除功能须配套修 uk。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 01:19:13 -07:00
lili
2620d90b8f
docs(进度总账): V26 已应用 + chapter e2e 转正(全量 43/0 全绿,软删 uk 修复闭环)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 00:33:48 -07:00
lili
a752626286
test(content): V26 应用后 chapter-create-delete e2e 转正(全量 43/0 全绿)
...
V26(章节/Block order_no uk 改 partial index WHERE deleted=false)已 flyway 应用(now at v26),
curl 实证建 order=2 章节(之前撞软删行 → 500)→ code:0。chapter-create-delete.spec.ts 由 test.fixme
转回 test(),建→删配对通过;全量 e2e 43/0(原 +1 fixme 现转正、0 skipped)。
content 写路 + 软删 uk 修复完整闭环:chapter create/work delete 前端契约 + chapter/block order_no
后端 schema 双修验证通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 00:32:48 -07:00
lili
5c6409ea7a
docs(进度总账): 写命令契约盘点收口(agent/kb/market 健康,content 写路是唯一 gap 区)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 19:12:47 -07:00
lili
172261f540
fix(content): V26 修章节/Block 软删后 order_no uk 碰撞(partial index,待人类应用 flyway)+ 软删 uk 全仓审计
...
审计(用户授权):Explore 扫 177 uk,22 高危/137 中危/18 安全(yudao 软删 + ~99% uk 漏 WHERE deleted=false)。
精炼剔假阳(幂等/递增键不复用),真可复用业务键 uk = content order_no×2(确证)+ meta/ai/knowledge *_key×13。
全仓 ON CONFLICT 仅引用 command_id/id/asset/kb/validation/source,22 高危均不被引用→改 partial 安全。
V26 修 chapter+block order_no 改 partial index WHERE deleted=false(block create L294 确证同 selectCount+1 bug)。
应用需重启 48080 跑 flyway(DDL 改真 PG,auto-mode 归人类执行,未绕过)。chapter-create-delete e2e 保持
test.fixme、注释指向 V26,人类应用后转正。其余 13 业务键 uk 建议 V27 按模块逐步修(账本有清单)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 19:09:59 -07:00
lili
a30a9686ff
docs(进度总账): 删除作品契约字段修复 + content 写路系统性 gap 小结(59d1396,全量 42/0)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 14:09:27 -07:00
lili
59d139637a
fix(editor): 修删除作品缺契约字段致真后端 400(反假绿挖出,纯前端修复)
...
前端 useWorkDelete 此前 api.delete 不传 body,而后端 deleteWork 要 @Valid RevisionCommandReqVO
(commandId 幂等 + expectedRevision 作品乐观锁)→ 真后端删作品必 400(dev mock 不校验长期掩盖)。
又因列表 VO(GET /works)不含 revision 字段(仅 detail 有),无法直接取乐观锁版本;故 useWorkDelete
改为删除前先读 work 详情拿 revision,再带 commandId 提交删除(删除低频、额外一次 GET 可接受)。
补 work-create-delete.spec.ts(配对自清理 e2e:建作品→删作品,验 DELETE 200/code:0 + 列表无残留)。
curl 实证后端 work create→delete code:0(无 chapter 那类 order_no schema bug)。
tsc/eslint 0,vitest 79/79,全量 e2e 42/0(+1 chapter fixme)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 14:08:08 -07:00
lili
c4d3041268
docs(进度总账): 章节新建前端契约修复 + 后端 order_no 软删 schema bug 发现(ca33c8e,待人类定 DDL)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:56:21 -07:00
lili
ca33c8e006
fix(editor): 修新建章节缺契约字段致真后端 400(反假绿挖出)+ 标注暴露的后端 order_no 软删 bug
...
前端 useChapterCreate 此前只传 {title},而后端 ChapterCreateReqVO 强制 commandId(幂等)+
expectedWorkRevision(作品乐观锁),缺失被 @Valid 拦成 400——dev mock 不校验、长期掩盖,真后端建章必败。
修:useChapterCreate 补 commandId + expectedWorkRevision;ChapterPanel 经 props 接 work.revision、
WorkspacePage 传入;建章后失效 workDetail 缓存避免后续写命令复用旧 revision。
补 chapter-create-delete.spec.ts(配对自清理 e2e),暂 test.fixme:前端修复后请求合法到达后端,
又暴露独立后端 bug——createChapter orderNo=selectCountByWorkId(active)+1,章节软删后行仍在、
uk_muse_content_chapter_work_order 不含 deleted(同文件 command uk 是 partial index 却此处遗漏)
→ 删章节后再建 order_no 冲突 500。属 schema/软删语义,需人类定 DDL 修法,fixme 待修。
tsc/eslint 0,studio vitest 79/79,全量 e2e 41/0(+1 fixme)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:54:34 -07:00
lili
901f8e8aec
docs(进度总账): 个人中心 account 面真后端 e2e 全闭环(全量 41/0)
...
补权益配额/用量归属 e2e(1dbbfc7);account 面 profile 读写/权益配额/用量归属/
购买授权发布三件套/安全事件 ack 全覆盖。本会话 35/1→41/0。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:31:47 -07:00
lili
1dbbfc78b5
test(account): 补权益配额/用量归属真后端 e2e(UsageStats,account 面收口)
...
GET /account/entitlements(套餐/配额/发布能力)+ /account/usage(Token 用量/归属分布)
此前无专门 e2e(live-read 仅断言 nickname、未覆盖 UsageStats);curl 证两端 code:0 就绪。
补 account-usage.spec.ts(验 200/code:0 + 「权益与配额」/「归属分布」区块渲染)。
全量 e2e 41/0。至此个人中心 account 面真后端 e2e 全闭环(profile 读写 + 权益配额 +
用量归属 + 购买/授权/发布三件套 + 安全事件 ack)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:31:00 -07:00
lili
fd52b4660a
docs(进度总账): profile 写路 e2e + jsonb update 500 修复 + agent 污染清理(全量 39/0)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:20:38 -07:00
lili
3ffee3599a
test(e2e): global-setup 清理 agent-create 累积污染(修 live-read ai 稳定红)
...
agent-create.spec uniqueName=`活体智能体-e2e-${Date.now()}` 不幂等,每跑新建一个自建 agent,
累积 22 条后按 updatedAt 倒序把种子「活体测试智能体」挤出后端默认分页第一页,致 live-read
「智能体列表渲染真实 Agent」断言 timeout(随历史跑次增多从绿变稳定红)。global-setup 加第 11 节
删 e2e 前缀 agent、保留种子。全量 e2e 39/0。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:19:34 -07:00
lili
f3ea06c154
fix(account): 修个人中心资料更新 jsonb 类型错致 update 500(反假绿挖出)
...
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 与 insert 路径对齐。
新增 account-profile-update.spec.ts(真后端写路 e2e:改公开署名→PATCH /profile→
code:0+version 乐观锁自增+UI 回显;只改署名不动昵称以不破坏 live-read 的 nickname 断言)
正是它暴露此 bug——curl 实证旧 jar PATCH 500、rebuild 后 code:0。全量 e2e 39/0。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:19:16 -07:00
lili
366ed63544
docs(进度总账): 个人中心市场记录三件套 e2e 全闭环(全量 38/0)
...
补购买/授权真后端 e2e(db63b2d),与已有「我的发布」同 service
(AccountMarketRecordService 读 muse_account_record_projection)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 12:56:56 -07:00
lili
db63b2d57e
test(account): 补个人中心购买/授权记录真后端 e2e(市场记录三件套补完)
...
purchases(GET /account/purchases)/licenses(/account/licenses)与已有「我的发布」同源
(AccountMarketRecordService 读 muse_account_record_projection 投影表),此前有 UI+hook
但缺真后端 e2e 验证(假绿风险)。补两 test:验 200/code:0 + 「我的购买」/「我的授权」区
真后端读通渲染。全量 e2e 38/0(原 36/0)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 12:55:50 -07:00
lili
38d4631f06
docs(进度总账): market-publish 列表慢一拍已修,全量 e2e 转 36/0
...
真根因=React Query refetch 被 dedup 到 save 的 in-flight 请求(返回提交前快照)
+ vite dev proxy 未透传 no-store 致浏览器误缓存,非此前记的"无排序"/"写后读延迟"。
修复 cancelQueries+refetchQueries+no-store(commit 23953fb)。studio 全量 e2e 现 0 红。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 12:49:02 -07:00
lili
23953fb701
fix(market): 修提交审核后「我的发布记录」列表慢一拍(全量 e2e 转 36/0)
...
根因(深度诊断,逐层排除):
1. React Query dedup: save→submit 链上 save 的 invalidate 已触发一次 refetch,
提交时它仍 in-flight,submit 的 invalidate 被 dedup 到该旧请求(返回提交前快照),
致「我的发布记录」刷不到刚提交申请(列表慢一拍);
2. 浏览器缓存: vite dev proxy 未透传后端 Cache-Control: no-store,浏览器按默认
启发式缓存 GET,refetch 命中旧缓存。
修复:
- 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。决定性诊断: browserFetch(no-store page.evaluate
直查)拿 fresh 而 React Query refetch 返回 stale,证 refetch 被 dedup 未发新请求;
cancelQueries 后 refetch 转 fresh。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 12:47:44 -07:00
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