Yaojia Wang
|
5674158707
|
feat(ui): 工作台精修 + 拆分(P3-3..7)
- Workbench.tsx 937→467 行,抽出 AiToolbar/WorkbenchToolbar/MobileContextBar
- P3-3 AI 工具条分组留白 + 眉题 + 主 CTA 凸显
- P3-4 专注写作模式(useFocusMode hook+vitest,隐藏侧栏加宽正文)+ 左双栏面色区分
- P3-5 右栏本章参考小标题去衬线(font-sans) + 空态引导(无标题保 h2→h3 大纲)
- P3-6 底栏信息/操作/状态三区 + TOC 当前章高亮;TOC 状态点因无每章状态数据跳过
- P3-7 展示层流式跟随滚动(不触碰 SSE 逻辑,尊重 reduced-motion)
- AppShell 加可选 hideNav(加法式,默认 false)
|
2026-07-11 08:04:56 +02:00 |
|
Yaojia Wang
|
67e30a6863
|
feat(ui): P3 页面级应用(作品库卡片/空态/加载/设置/次级页)
- 作品库卡片重设计:书脊封面字块 + 衬线书名 + 一句话故事(缺失给占位) +
元信息行(题材徽章/StatusDot 待审/mono 时间),Card tone=card 浮起消塌陷
- EmptyState 中性化 + inline/card/bare 变体 + eyebrow(向后兼容)
- loading 骨架化(Skeleton 拼作品库结构,motion-safe)
- 设置页拆分 ProvidersSettings 489→198 + 5 个子组件,凭据点用 StatusDot
- 次级页(向导/模板/codex/大纲)排版字阶与圆角 token 收敛
|
2026-07-11 07:36:32 +02:00 |
|
Yaojia Wang
|
d3e9ae972f
|
feat(ui): 新增 PageContainer 统一页容器(P3-1)+ 作品库采用
|
2026-07-11 07:26:54 +02:00 |
|
Yaojia Wang
|
83ba47ab8f
|
feat(ui): 共享组件补齐——Card 面色分层 + Button link/lg + 4 原子件
- Card 新增 tone(panel/card/soft)/flat/interactive;cardClass 兼容旧字符串签名
- Button 新增 link(coral 文字链) 变体与 lg 尺寸
- 新增原子件 Eyebrow(统一眉题) / StatusDot(状态点·读屏可见) /
Skeleton(motion-safe 占位) / Meter(进度条·progressbar)
- PageHeader/SectionHeader 用 display/title 字阶 + Eyebrow 眉题
|
2026-07-11 07:24:08 +02:00 |
|
Yaojia Wang
|
fd6551b0ba
|
feat(ui): 稳健跨 OS 衬线兜底栈 + 双主题 token 奇偶校验
- 决策:不自托管 CJK webfont(数 MB + 构建期外拉,违反 CSP 友好/首屏)
改用跨 OS 系统衬线栈,保证中文标题可靠命中衬线,零 webfont 字节
- 新增 themeParity 测试:paper/night 两块 --color-* 必须成对,防漏配破面
|
2026-07-11 07:18:23 +02:00 |
|
Yaojia Wang
|
b9f9134748
|
feat(ui): 补齐分层设计 token 并迁移共享变体(对标 Claude DESIGN.md)
- 面色阶 surface-soft/card/strong + 文字 5 级 body-strong/body/muted-soft
- 边框 line-soft、coral 状态 cinnabar-active/disabled(按压变深 + 奶油化禁用)
- 圆角刻度 xs..xl/full:按钮 rounded-md、卡片 rounded-lg、徽章 pill
- 排版档 display/title/caption/eyebrow/prose(衬线负字距)
- 动效 token duration-fast/base + ease-standard,transitionUi 常量统一过渡
- 焦点环统一 cinnabar/35;双主题成对定义
|
2026-07-11 07:16:00 +02:00 |
|
Yaojia Wang
|
57b3183564
|
docs: 写作台放置规则入 decisions + 登记 UX P2 完成(P2-3,P0/P1/P2 整套完成,P2-4 延后)
decisions.md 落四象限唯一落点规则(导航→左栏/AI 动作→中央/状态→底栏/参考→右栏)防三重复回潮;PROGRESS 登记 P2-1..P2-3 落地、门禁绿(vitest 716/build OK),P2-4 统一对话面板按计划延后。
|
2026-07-10 18:14:56 +02:00 |
|
Yaojia Wang
|
dbece64d4d
|
feat(frontend): 「目录」列可折叠、记忆折叠状态(UX P2-2)
useChapterListCollapse 用 localStorage 记忆折叠态(SSR 首帧恒展开避免 hydration 不一致);收起降为带展开按钮的窄轨、让宽给正文,展开时标题旁加收起按钮;三栏栅格据折叠态切列宽,章节列表/高亮/切章导航全保留。
|
2026-07-10 18:14:49 +02:00 |
|
Yaojia Wang
|
3c87b01379
|
feat(frontend): 左栏 10 项按写作/资料库/审阅/更多分组(UX P2-1)
navSections(projectId?) 纯函数把平铺项目项归为四组,NavItems 复用「本作」小标题模式逐组渲染;链接/路由/激活键不变,工具箱收进「更多」不丢入口。
|
2026-07-10 18:14:41 +02:00 |
|
Yaojia Wang
|
e9c5502c2d
|
feat(frontend): 底栏瘦身 + 或让 AI 动作行 + 动词范围提示 + 题材去弹窗(UX P1-1/P1-4/P1-5)
|
2026-07-10 18:00:42 +02:00 |
|
Yaojia Wang
|
9f6cbb5598
|
refactor(frontend): 右栏去术语——本章参考/AI 写这章会参考/写完后检查,删重复去审稿(UX P1-3)
|
2026-07-10 18:00:36 +02:00 |
|
Yaojia Wang
|
59d7c75737
|
feat(frontend): 统一「采用」动词族——替换整章/加到章末/替换这段,弃「回填」(UX P1-2)
|
2026-07-10 18:00:28 +02:00 |
|
Yaojia Wang
|
ceae24740a
|
feat(frontend): 正文上方常驻 AI 输入条 + 对话记录正名 + 润色提示 + HITL 微文案
回答用户原话「我怎么和 AI 对话」(docs/design/ux-exploration.md §4 P0-1/2/4/5)。
P0-2 把折叠的「本章写作指令[可选]」原地提升为正文正上方常驻输入条:标题
「告诉 AI 这章想怎么写」、去「可选」徽标、空章默认展开、「AI 写作诉求」→
「你的写作要求」、邀请式 placeholder;发送键即「写本章」(streaming 时切
「停」),复用 composeDirective + 文风/剧情 chips + 流式打字机,不改成聊天气泡。
P0-1 底栏「AI 对话」→「对话记录」(只读日志正名),抽屉标题/aria/空态同改。
P0-4「润色选段」常驻可点,无选区点击弹 toast 提示(去 hover-only title)。
P0-5 输入条旁常驻 HITL 微文案 +「?这是什么」可再发现弹层(非一次性 coach)。
|
2026-07-10 17:43:59 +02:00 |
|
Yaojia Wang
|
61a6931bb1
|
refactor(frontend): 删顶部「AI 工具条」,--chrome 归位 4rem(写作台 UX P0-3)
顶栏「AI 工具条」5 项全是重复左栏的导航链接,且让「写本章」同时是导航
Link 与生成动作两种相反含义。删掉后导航只归左栏,同时消灭最严重的三重复
+ 假「AI」标签 + 「写本章」双重含义,并省下 48px(--chrome 7rem→4rem)。
死代码 AiToolbar/AiToolbarMoreMenu/ai-tools 全仓仅 AppShell 引用,一并移除。
|
2026-07-10 17:43:46 +02:00 |
|
Yaojia Wang
|
5317d601dd
|
docs: 墨痕写作台 UX 探索报告——多 agent 诊断 + P0/P1/P2 分级改造计划
|
2026-07-10 17:33:01 +02:00 |
|
Yaojia Wang
|
222cc48f5a
|
docs: 登记 AC-3 后续——润色/重写内联对话气泡流(用户反馈,抽屉保留)
|
2026-07-10 16:32:15 +02:00 |
|
Yaojia Wang
|
1185069572
|
feat(frontend): 润色/整章重写面板内联对话气泡流(就地可见)
用户反馈:不想每次开「AI 对话」抽屉才看得到对话,要在对话时就地内联可见。
RefinePanel/ChapterRewritePanel 内联渲染 role=log 滚动气泡流(本章 refine/rewrite
+ 其 clarify 往复 ∪ 本轮进行中气泡:流式 token 逐字进气泡、缓冲的 clarify Q&A
亦实时可见),输入框置底像聊天。pending→persisted 无重影(进行中气泡结束即清、
已落库去重);fail-soft(历史加载失败仍显示本轮实时气泡,不阻塞回炉/重写);
气泡「再接受/回填」复用既有 DRAFT-only HITL 回调(drift-safe,正文仍只在验收才变);
clarify gating/abort/停/接受悉数保留。Workbench 改传 conversation + onReaccept。
AiConversationDrawer 保留原样(底栏仍可开,跨章/项目级全量历史浏览)。
|
2026-07-10 16:32:10 +02:00 |
|
Yaojia Wang
|
5af45f5034
|
refactor(frontend): 抽出可复用 ConversationThread + inlineConversation 纯助手
把 AiConversationDrawer 内联的气泡渲染(Bubble/readOptions/ACCEPT_LABEL)提取为
共享的 ConversationThread 组件,抽屉改为复用之(外观不变,DRY)。新增纯助手
lib/workbench/inlineConversation.ts:mergeInlineThreads(已落库留痕 ∪ 进行中气泡,
按 id 去重 + 复用 groupByThread 定序)、toPendingView(合成未落库气泡,meta._pending/
_streaming UI 标记)、isPendingView/isStreamingView/readSegment,配 9 单测(RED→GREEN)。
为内联对话视图铺路;抽屉行为完全不变。
|
2026-07-10 16:31:53 +02:00 |
|
Yaojia Wang
|
f6e88d7438
|
test(qa): AI 对话(聊天记录)E2E + #1/#6 真源围栏守卫(AC-4)
计划 §6/§8。收口 AI-chat-history 功能(AC-1..AC-4 全交付)。
- tests/test_ai_chat_history_e2e.py:真 pg、零 LLM/无网关(纯 CRUD 侧记录),
覆盖 §6 全 6 用例——缓冲多轮线程一批落库 + GET newest-first/meta 保真、
作用域分区(本章 ∪ 项目级 NULL)、跨批分页 + kind 过滤、
append 只写 ai_messages(其它业务表零变 + usage_ledger 恒 0)/GET 只读、
404 + 五类 422 失败零落库、clarify-abandon(服务端无部分写路径)。
- tests/test_ai_messages_not_in_generation_path.py:AST 静态围栏——
memory/orchestrator 两目录无一 import/引用 ai_messages,
MemoryRepos 捆绑与 assemble 形参都不含它;植入违规自证探测器非空,能变红。
- memory/gotchas.md:登记 ai_messages 真源围栏(append-only 侧记录,
绝不喂 assemble/prompt;接入生成链 = code-review BLOCKER)。
门禁全绿:ruff/format · mypy 238 · alembic 无漂移 · pytest 1002 passed(+10)。
|
2026-07-09 17:42:45 +02:00 |
|
Yaojia Wang
|
5ba3eabda3
|
docs: 登记 AC-3 ✅——AI 对话前端(gen:api + hook/抽屉 + 五类交互留痕)+ 台账
|
2026-07-09 17:28:11 +02:00 |
|
Yaojia Wang
|
33a9b7656c
|
feat(frontend): 五类交互接入 AI 对话留痕 + Workbench 抽屉入口(AC-3)
- RefinePanel/ChapterRewritePanel:结束后 append [author(意见/答复), ai(产出)];
clarify buffer-until-concluded——澄清 Q&A(原意见→反问→答复)缓冲,随最终产出批
一起落库同 thread;纯放弃不记。refine ai 行 meta 存 version_no+原选段(每版重锚)。
- ContinuePanel:ai-only(续写无作者输入),每候选一条 ai 气泡 meta{candidate_index}。
- GeneratorRunner:成功后 append [author(字段摘要, meta{tool_key,input_fields}),
ai(渲染预览, meta{tool_key,output_kind})];空产物不记。lib/toolbox/aiSummary.ts 纯助手+单测。
- InlineToolbox→GeneratorRunner 透传 append+本章号;ToolboxPage 用 silent 直投项目级(chapter_no=null)。
- Workbench:挂 useAiConversation 单实例 + AiConversationDrawer + 底栏「AI 对话」入口(flag 灰度),
三个 DRAFT-only 再接受回调(替换整章/插入正文/回填选段),成功关抽屉+toast、漂移不盲替换。
|
2026-07-09 17:27:14 +02:00 |
|
Yaojia Wang
|
59f2f60a7e
|
refactor(frontend): 四生成 hook 结束后额外返回产物(AC-3 留痕前置)
useRefine.refine/recommunicate→RefineVersion|null、useContinue.generate→string|null、
useChapterRewrite.send→RewriteVersion|null、useGenerator.generate→GeneratorArtifact|null。
向后兼容(既有调用忽略返回值不受影响);各 hook 成功用例补返回值断言。
面板据此 if(artifact) 才 append,空候选/错误路径不留痕。
|
2026-07-09 17:15:49 +02:00 |
|
Yaojia Wang
|
ddf7fa061a
|
feat(frontend): AI 对话核心——视图模型 + 数据/追加 hook + 抽屉(AC-3)
- lib/workbench/aiConversation.ts:纯视图模型(kind 标签/徽标、bubbleSide、
按 thread 归组 (created_at,seq) 定序、按作用域分区、接受动作映射)+ 单测。
- lib/workbench/useAiConversation.ts:Workbench 级懒加载 + 批量 append(乐观插入 +
正位对账 / 失败回滚),fail-soft 绝不 throw 进生成/HITL;silent 直投供工具箱页。
renderHook 测试覆盖懒加载去重、对账、回滚、silent、项目切换复位。
- components/workbench/AiConversationDrawer.tsx:本章对话 + 项目级生成两段的气泡抽屉,
克隆 ContextDrawer 的 a11y(role=dialog/log、Esc、focus trap、还原焦点);
ai 气泡挂 DRAFT-only 再接受按钮(替换整章/插入正文/回填选段),不绕开验收事务。
- lib/api/types.ts:re-export AiMessage* 码生成名。
|
2026-07-09 17:11:09 +02:00 |
|
Yaojia Wang
|
dce882ca91
|
chore(frontend): pnpm gen:api 纳入 AI 对话端点(AC-3)
POST/GET /projects/{id}/ai-messages + AiMessageAppendRequest/AiMessageInput/
AiMessageView/AiMessageListResponse 由后端 OpenAPI 重生成进 schema.d.ts。
|
2026-07-09 17:00:14 +02:00 |
|
Yaojia Wang
|
7c4b3c95be
|
docs: 登记 AC-2 契约 C3 扩(AI 对话端点)+ PROGRESS 台账
- memory/contracts.md:C3 扩(AC-2)AI 对话端点登记「稳定」——POST/GET
/projects/{id}/ai-messages 请求/响应 schema + per-kind meta 形状 +
冻结 schema 名;标注 @frontend AC-3 须 pnpm gen:api。
- PROGRESS.md:AC-2 标 ✅(commit c675a74)+ 一行台账 + 变更日志。
|
2026-07-09 16:55:39 +02:00 |
|
Yaojia Wang
|
c675a74f1d
|
feat(backend): AI 对话聊天记录 repo + append/list 端点(AC-2)
在 C2 扩(AC-1) `ai_messages` 表上落 AC-2 后端(计划 §3):
- repo `SqlAiMessageRepo`:批 append(seq=批内 0 基位置、同 thread_id、只 flush)
+ `list_for_chapter` newest-first(created_at DESC, seq DESC)、chapter_no 过滤含
项目级 NULL union、可选 kind、limit/offset。
- schemas `ai_messages.py`:批级 append 信封 + Literal 枚举权威(kind/role)+ content
200k 上限 + meta 序列化兜底。
- 端点 `POST/GET /projects/{id}/ai-messages`(tag ai-messages,已注册):显式记录写入,
五个生成端点保持只读不变(守 #3);项目 404、校验 422、POST 端点提交。
- 注入缝 `get_ai_message_repo`。
TDD:repo 真 pg 单测(seq/定序/union/分页/flush-only)9 passed;端点集成测试
(round-trip/union/kind/404/422×5/commit 边界)12 passed。门禁全绿:ruff/format/mypy
238 files/alembic check 无漂移/pytest 992 passed;新模块 cov router+schemas 100% / repo 97%。
|
2026-07-09 16:54:52 +02:00 |
|
Yaojia Wang
|
1a188e6e5b
|
feat(db): ai_messages 表 + 迁移——作者↔AI 往复聊天记录 append-only 侧表(AC-1)
计划 §2 canonical DDL:AiMessage(UuidPk, CreatedAt, Base),project_id(FK CASCADE)/
chapter_no(nullable=项目级)/thread_id/seq(repo 批内定序)/kind/tool_key/role(CHECK)/
content/meta(JSONB '{}'),append-only 无 updated_at。复合索引 (project_id,chapter_no,
created_at DESC) 手写 sa.text DESC + FK 单列索引。迁移 ceabd3c2c00d(down=f6a7b8c9d0e1),
autogenerate 仅捕获 ai_messages 无杂散漂移。T0.2 后第一张新业务表;旁路侧记录非手稿真源,
assemble()/agent 永不读(守 #1/#3/#6)。契约 C2 扩已「稳定」。
|
2026-07-09 16:39:24 +02:00 |
|
Yaojia Wang
|
9da938d39b
|
docs: AI 对话(聊天记录)实施计划入库 + 台账登记(决策全 A,开工)
|
2026-07-09 16:33:14 +02:00 |
|
Yaojia Wang
|
31067abbed
|
merge: writing-first 工作台 + QA-CR 整改 + WFW-9 澄清收尾 + 本地端口 +1000(feat/writing-first-workspace,66 提交)
- 写作工作台重构 WFW-0~9:进来即写 / 编辑器内 refine·续写·工具箱·整章重写 / AI 反问澄清 M1–M3
- QA-CR 全项目评审整改:2 CRITICAL + 13 HIGH 全修(对抗式复核 0 遗留)+ MEDIUM/LOW 批
- 本地/compose 宿主端口 +1000 防冲突(web 4000 / api 9000 / pg 6432)
|
2026-07-08 18:53:57 +02:00 |
|
Yaojia Wang
|
c34dbf5d2d
|
chore(devops): 本地/compose 宿主端口 +1000 防冲突(web 4000 / api 9000 / pg 6432)+ 文档登记
|
2026-07-08 17:33:43 +02:00 |
|
Yaojia Wang
|
2145d33cc7
|
docs: 修正台账——CR-M4/M5/L1 状态标 ✅(代码早已提交,前端 agent 漏翻表格状态)+ MEDIUM/LOW 批收口
|
2026-07-08 14:37:35 +02:00 |
|
Yaojia Wang
|
a039a1e5d9
|
chore(devops): 抬高后端依赖下界至 lockfile 主次版本,保可复现(CR-D1)
|
2026-07-08 13:34:36 +02:00 |
|
Yaojia Wang
|
05f49d0b7f
|
docs: 登记 CR-M4/M5/L1 前端评审收尾(done/skipped)
|
2026-07-08 13:27:46 +02:00 |
|
Yaojia Wang
|
64145422eb
|
refactor(web): 去冗余 cast(idx.valueOf / dict[error] as string)
stream/sse.ts SseFrameBuffer 去 idx.valueOf()(idx 本就是 number);jobs/job.ts 去 dict["error"] as string(typeof 守卫后 TS 自动收窄)。typecheck 绿。
|
2026-07-08 13:27:45 +02:00 |
|
Yaojia Wang
|
16f2eae2d3
|
test(web): parseJsonBody 补非对象/非 JSON 守卫分支测试
server.parseJsonBody 已具边界校验,补两条守卫分支测试(200 返回原始值/非 JSON 体均抛结构化错误)。
|
2026-07-08 13:27:45 +02:00 |
|
Yaojia Wang
|
9cf4915d49
|
refactor(web): hasApplicableFix 改类型谓词,消除 applyConflictFix 强转
hasApplicableFix 重写为对象入参类型谓词 patch is ApplicablePatch,谓词命中后 applyConflictFix 里 original/replacement 自动收窄为 string,删两处 as string;补收窄单测。
|
2026-07-08 13:27:45 +02:00 |
|
Yaojia Wang
|
d80d41a08d
|
refactor(web): ApiErrorEnvelope 改由生成 schema 派生,防契约漂移
手写 ApiErrorEnvelope 改由 components["schemas"]["ErrorEnvelope"] 派生;accept 端点专属 details.missing_conflict_indices 就地收窄。运行时行为不变(既有 useAccept 测试全绿)。
|
2026-07-08 13:27:32 +02:00 |
|
Yaojia Wang
|
125908ed83
|
fix(web): ReviewReport flashMark 定时器卸载清理,防泄漏
flashMark 的 setTimeout 句柄入 ref + 卸载 useEffect 清理,重复触发先清旧定时器;提 FLASH_DURATION_MS 常量。闪烁行为不变。
|
2026-07-08 13:27:32 +02:00 |
|
Yaojia Wang
|
47d5558e4a
|
feat(web): NavDrawer 补 aria-controls + ForeshadowCard 语义化 dl/dt/dd(a11y)
NavDrawer 汉堡按钮补 aria-controls 指向抽屉面板(Drawer 新增可选 id prop,默认 nav-drawer);ForeshadowCard 的 <dl> 裸 <div> 行改真 <dt>/<dd> 结构,可视文案不变,importance 用 sr-only 标签。行为不变。
|
2026-07-08 13:27:32 +02:00 |
|
Yaojia Wang
|
1bda024141
|
chore: 撤销 c596a8d 误提交的非源文件(.coverage/AGENTS.md/example_skills),忽略 .coverage
|
2026-07-08 13:13:38 +02:00 |
|
Yaojia Wang
|
f160a7dac1
|
docs: 登记 QA-CR MEDIUM/LOW 网关+链整改批(CR-M2/M3/L1@llm/M1.4)——6 done 2 skip
|
2026-07-08 13:11:18 +02:00 |
|
Yaojia Wang
|
6a739cad5e
|
perf(chain): review 节点并行扇出五审——复用主图 add-only 记账并发范式(CR-M3-6)
|
2026-07-08 13:08:19 +02:00 |
|
Yaojia Wang
|
ec91c8fdf7
|
refactor(chain): 链 runner 经公开 aget_state.interrupts 判暂停——弃私有 __interrupt__ 键(CR-M3)
|
2026-07-08 13:04:28 +02:00 |
|
Yaojia Wang
|
c9ffada503
|
feat(orchestrator): 续写链前一章无已验收终稿发 warning——静默丢前文引子可观测(CR-L1)
|
2026-07-08 13:02:30 +02:00 |
|
Yaojia Wang
|
832ab7dfa1
|
refactor(gateway): 适配器暴露 probe_connection 公开探测——provider_deps 弃私有 _client 反手(CR-M1.4)
|
2026-07-08 13:00:50 +02:00 |
|
Yaojia Wang
|
9439b97804
|
fix(gateway): 适配器瞬时错误消息脱敏——只留类名+状态码不泄漏厂商响应体(CR-M2-2)
|
2026-07-08 12:58:25 +02:00 |
|
Yaojia Wang
|
32451a9bd0
|
feat(gateway): 未知模型缺价发结构化告警——成本账缺项可观测(CR-M2-1)
|
2026-07-08 12:56:00 +02:00 |
|
Yaojia Wang
|
9ee7c7b000
|
docs: 登记 CR-M1 + CR-L1 后端片落地——台账 + @llm item#4 请求
CR-M1 4/6 完成(volume 下推 / N+1→create_many / jobs→JobRepo / 列表分页),
item#4(_client) 与 item#6(assemble 并行) SKIP(理由入台账);CR-L1 后端片
(SSE OpenAPI)完成,print 属误报。附给 @llm 的 probe_connection 请求。
|
2026-07-08 12:48:51 +02:00 |
|
Yaojia Wang
|
49e3cb6dc4
|
docs(backend): SSE 端点在 OpenAPI 如实声明 text/event-stream
draft/rewrite/review 三个流式端点返回 StreamingResponse,OpenAPI 原按默认
application/json 标注 200,schema 不诚实。新增共享 _SSE_RESPONSE 声明 200 的
content 为 text/event-stream 并挂到三个装饰器。export_openapi 通过,schema 现
出现 3 处 text/event-stream。未跑前端 gen:api(按要求)。
|
2026-07-08 12:46:15 +02:00 |
|
Yaojia Wang
|
bf3dabea82
|
perf(backend): 角色/世界观入库改批量——create_many 一次 flush 落全部行
角色入库端点与 toolbox world_entities 入库端点原逐卡/逐条 create(每行一次
SELECT/flush/refresh,N+1 round-trip)。新增 create_many:世界观用 add_all,
角色用一次 IN 查已有名 + 一次 flush(保持 (project_id,name) upsert 幂等与批内
重名去重、保序返回)。单条 create 薄封装 create_many,行为不变(既有调用方/E2E
复用)。复活并复用 CharacterWriteFields、新增 WorldEntityFields 作批量入参。
补两端点「多行一次落库」测试;既有幂等/冲突 gate 测试与 m5 真 pg E2E 全绿。
|
2026-07-08 12:44:07 +02:00 |
|