docs(进度总账): 删除作品契约字段修复 + content 写路系统性 gap 小结(59d1396,全量 42/0)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
lili 2026-06-21 14:09:27 -07:00
parent 59d139637a
commit a30a9686ff

View File

@ -161,6 +161,7 @@
- ✅ **2026-06-21:补个人中心「保存资料」写路 e2e + 挖出并修 profile update 500 真后端 bug(反假绿)**`account-profile-update.spec.ts`(改公开署名→PATCH /profile→code:0 + version 乐观锁自增 + UI 回显;只改署名不动昵称以不破坏 live-read 的 nickname 断言)暴露真后端 bug:`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`(commit `f3ea06c`)。curl 实证旧 jar PATCH 500、rebuild+重启后 code:0+version 2→3。**连带修测试污染**:`agent-create.spec` uniqueName=Date.now() 不幂等每跑新建 agent,累积 22 条后按 updatedAt 倒序把种子「活体测试智能体」挤出后端默认分页第一页,致 live-read ai 断言从绿变稳定红;global-setup 加第 11 节删 e2e 前缀 agent、保留种子(commit `3ffee35`)。**全量 e2e 39/0**。教训:LambdaUpdateWrapper.set 写 jsonb/json 列必须显式带 typeHandler(不继承 DO @TableField);写路 e2e 用唯一值避免 pre-existing 假绿,但唯一值累积会污染列表类断言,需 global-setup 清理配套。
- ✅ **2026-06-21:补权益配额/用量归属真后端 e2e + 个人中心 account 面 e2e 全闭环**`UsageStats`(GET /account/entitlements 套餐/配额/发布能力 + GET /account/usage Token 用量/按归属分布)此前无专门 e2e(live-read 仅断言 profile nickname、未覆盖 UsageStats);curl 证两端 code:0 真后端就绪(非 facade unavailable)。补 `account-usage.spec.ts`(验 200/code:0 + 「权益与配额」/「归属分布」区块渲染,不依赖数值,commit `1dbbfc7`)。**至此个人中心 account 面真后端 e2e 全闭环**:profile 读(live-read)+ 写(account-profile-update)、权益配额、用量归属、购买/授权/发布三件套(account-market-records + account-publish-records)、安全事件 ack(account-security-ack)。**全量 e2e 41/0**(本会话 35/1→41/0:净增 6 真后端 e2e、修 market-publish 慢一拍 + profile update 500 两真因、清 agent 测试污染)。
- ✅/⚠️ **2026-06-21:修新建章节缺契约字段(前端真 bug)+ 挖出后端 order_no 软删 schema bug(反假绿,后端待人类定 DDL)**。延 #30 盘 content/editor 旅程发现:前端 `useChapterCreate` 只传 `{title}`,而后端 `ChapterCreateReqVO` 强制 `commandId`(幂等)+ `expectedWorkRevision`(作品乐观锁),缺失被 @Valid 拦成 400——dev mock 不校验长期掩盖、真后端建章必败。修:补两字段 + 经 WorkspacePage→ChapterPanel(props)→useChapterCreate 透传 work.revision、建章后失效 workDetail 缓存(commit `ca33c8e`);curl 证干净作品 create code:0。**修前端后请求合法到达后端,又暴露独立后端 bug**:`createChapter``orderNo=selectCountByWorkId(active)+1`,章节 `deleteById` 是软删(行仍在表),而 `uk_muse_content_chapter_work_order UNIQUE(tenant_id,work_id,order_no)` **不含 deleted**(同文件 `uk_muse_content_chapter_command` 却是 `WHERE command_id IS NOT NULL` 的 partial index——本该 partial 却遗漏)→ 删章节后再建 order_no 与软删行冲突 → **500**(影响 chapter create/reorder;block 等表 uk 同形、潜在)。属 schema/软删语义系统性问题,按规范归人类定 DDL 修法(**推荐**:uk 改 partial index `WHERE deleted=false`,对齐 command uk 惯例;备选 物理删 / order_no 取含软删 max+1)。e2e `chapter-create-delete.spec.ts``test.fixme` 标注待修(tracked 不掩盖)。注:测试在 work1 留了 1 个软删章节行(order=2,active 列表不显示),随后端修复一并清理。**全量 e2e 41/0(+1 fixme)**。
- ✅ **2026-06-21:修删除作品缺契约字段致真后端 400(同 content 写路系统性 gap,纯前端修复)**。续盘发现前端 `useWorkDelete``api.delete` 不传 body,而后端 `deleteWork` 同样要 `@Valid RevisionCommandReqVO`(commandId + expectedRevision)→ 真后端删作品必 400(dev mock 掩盖);叠加列表 VO `GET /works` **不含 revision**(仅 detail 有),拿不到乐观锁版本。修(纯前端):useWorkDelete 删除前先读 work 详情拿 revision、再带 commandId 提交(commit `59d1396`);WorkListPage 无需改(净零)。curl 实证后端 work create→delete code:0(无 chapter 那类 order_no schema bug,后端 work delete 干净)。补 `work-create-delete.spec.ts`(配对自清理,建→删验 200/code:0 + 列表无残留,**通过**)。**全量 e2e 42/0(+1 chapter fixme)**。**小结(content 写路系统性 gap)**:写命令前端普遍漏后端必填的 commandId/expectedRevision(dev mock 不校验长期掩盖),且部分列表 VO 不暴露 revision——本会话已修 work create(早前)/chapter create/work delete;chapter delete 的 expectedRevision 硬编码=1 对 revision>1 章节仍是隐患(待评估),建议后端列表 VO 统一暴露 revision。
- 现状:其余旅程仍 ~14% 真连、dev 默认 MSW;但 MVP#1 已打通"关 MSW→直连活体→playwright e2e"模式(见下),可复用到后续旅程。
- ✅ **AI 候选采纳(rendered UI 活体证,2026-06-14)**:`main.tsx``VITE_API_MOCK=false` 开关关 MSW、前端直连活体单体;`accept-suggestion.spec.ts` 在 chromium 实跑——**happy-path**(生成经 page.route stub 发真实 suggestionId→点"采纳替换"→真合并)隔离跑绿 + DB 证(block rev1→2、正文=候选);**negative-path**(陈旧 revision)绿(乐观锁 1041000002)。连带**真实修复 client.ts 注入 tenant-id**(活体集成缺口,dev MSW 不校验故没暴露)。**遗留**:happy-path 受种子状态依赖(合并后 block rev 变 + RQ 缓存,需 fresh 种子复跑);`workspace.spec.ts` 已改活体壳冒烟(2026-06-15,MSW 互斥红消除、整套 8/8 全绿);suggestion 合并后留 pending=merge 不在同事务回写 AI 域状态(靠 outbox→AI 异步翻,本机 dispatcher 节流故 DB 仍 pending,读 `ContentSourceServiceImpl` 确认,非产品 bug)。
- ✅ **content/market/account/ai-agent 读旅程(rendered UI 活体证,2026-06-14)**:`live-read.spec.ts` 4/4 绿(MSW off,chromium:作品列表/市场浏览/个人中心/智能体列表均渲染真实后端数据)——证 tenant-id 修复后 studio 直连活体单体跨 BC 取数、真实数据形态与页面渲染契约对齐。