docs(mvp): 总账记 S7 分支① M2 达成(S7a/b/c 落地验真)
全文通路三步 916d6c87/fcd0623a/43a08624 逐一独立验真;所见即所写经真后端+真 New-API e2e 端到端证实 Canonical===客户端 finalContent。剩 S7d 切 Dify + S6/S8/S9。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
43a08624f8
commit
0451549829
@ -41,7 +41,14 @@
|
||||
|
||||
**2.0.0 单人版改造 S7.0 输出契约裁决(2026-07-07)**:在 live 单体(真 48080 + 真 New-API)上取全 plan 要求的三项证据后裁定 **S7 走分支①(建运行时不落库全文通路)**,项目所有者 2026-07-07 确认。证据:①SSE 流——后端不发 chunk(histogram chunk=0),dispatcher 同步生成完整文本后只写一条 `done`,`MuseAiTaskStreamServiceImpl.doneData` 只带 `{taskId, suggestionId, summary?}`,全文不经 SSE;②UI——CandidatePanel 凭 suggestionId 走 `GET /suggestions/{id}` 读 `data.content`;③DB——`muse_ai_suggestion.content_snapshot.content` 实测仅 50–60 字脱敏摘要(键 `content`+`outputSummary`),而原始 LLM 输出 >120 字。结论:现状用户在候选面板只看到 ~50 字脱敏摘要、看不到 AI 全文,分支②“已有全文通路”的前提不成立,AI 生成对用户长期半残。分支① 目标:runtime 内部结果加不落库的内存全文字段,经 SSE 填充 OpenAPI 已声明但当前未发的 `chunk.data.content` 推给前端(不新增破坏性字段),候选表仍只存脱敏摘要+三审,accept 走 merge_after_edit——全文只在传输/内存存在、永不落候选表,保住“AI 原始产出不落库、先审后入”主权。该通路 provider 无关(New-API/Dify 均透出全文到该字段),与切 Dify 正交。落地前置:按工程约定,S7 属跨模块+用户可见行为变更,须先出评审版设计再实现;provider 切 Dify 半段依赖 Muse 专属 Dify workspace 就绪。
|
||||
|
||||
**2.0.0 单人版改造 S7 全文通路评审版+执行版设计(2026-07-07)**:经三路 opus 子代理对后端生成路径/SSE 持久化重放/前端消费的精确测绘,产出 S7 分支①设计(`docs/agent-specs/2026-07-07-S7-生成主链全文通路-review.md` v0.2 + 同名 .html 速览 + `-execution.md` v1.0)。测绘校正了三个关键现状:完整正文只活在两个 real client 的 `success()` 里、构造结果前即被截成 60/80 字摘要出栈丢弃(唯一捕获点);SSE 严格只重放已持久化事件(凡送出必先落 `muse_ai_task_event`)、当前只发无正文的 done、chunk 契约与前端 `streamContent` 渲染早就位但后端从不产 chunk;且「三审」审的也是摘要、Dify 完成原因硬编码常量致截断护栏无效。设计=一条「瞬态全文」通路:捕获处对完整正文跑护栏→写瞬态加密缓存(对称复用既有 `MuseAiRuntimePayloadStore` 范式:独立表+短 TTL+加密+决定即清)→事件表发 chunk 引用行、SSE 重放回缓存取全文填已声明的 `chunk.data.content`(非破坏)→前端 `streamContent` 零改动渲染→采纳恒回传完整正文写 Canonical。主权红线:完整正文永不进候选表/正文表任何列。三个材料级点**所有者 2026-07-07 裁决全部采纳推荐**:①瞬态全文用独立加密缓存表(非 Redis、非落主表);②采纳恒回传完整正文(所见即所写,修掉「原样采纳把摘要写进 Canonical」的潜伏缺陷);③完整性护栏与合规审上移到完整正文(现状审的是摘要)。执行版拆 S7a(捕获+护栏,provider 无关不依赖 Dify)→S7b(瞬态载体+SSE 送达,新增 V35 迁移)→S7c(前端所见即所写+区分流不完整/为空)→S7d(切 Dify,依赖 Muse 专属 workspace)。下一步开工 S7a。
|
||||
**2.0.0 单人版改造 S7 全文通路评审版+执行版设计(2026-07-07)**:经三路 opus 子代理对后端生成路径/SSE 持久化重放/前端消费的精确测绘,产出 S7 分支①设计(`docs/agent-specs/2026-07-07-S7-生成主链全文通路-review.md` v0.2 + 同名 .html 速览 + `-execution.md` v1.0)。测绘校正了三个关键现状:完整正文只活在两个 real client 的 `success()` 里、构造结果前即被截成 60/80 字摘要出栈丢弃(唯一捕获点);SSE 严格只重放已持久化事件(凡送出必先落 `muse_ai_task_event`)、当前只发无正文的 done、chunk 契约与前端 `streamContent` 渲染早就位但后端从不产 chunk;且「三审」审的也是摘要、Dify 完成原因硬编码常量致截断护栏无效。设计=一条「瞬态全文」通路:捕获处对完整正文跑护栏→写瞬态加密缓存(对称复用既有 `MuseAiRuntimePayloadStore` 范式:独立表+短 TTL+加密+决定即清)→事件表发 chunk 引用行、SSE 重放回缓存取全文填已声明的 `chunk.data.content`(非破坏)→前端 `streamContent` 零改动渲染→采纳恒回传完整正文写 Canonical。主权红线:完整正文永不进候选表/正文表任何列。三个材料级点**所有者 2026-07-07 裁决全部采纳推荐**:①瞬态全文用独立加密缓存表(非 Redis、非落主表);②采纳恒回传完整正文(所见即所写,修掉「原样采纳把摘要写进 Canonical」的潜伏缺陷);③完整性护栏与合规审上移到完整正文(现状审的是摘要)。执行版拆 S7a(捕获+护栏,provider 无关不依赖 Dify)→S7b(瞬态载体+SSE 送达,新增 V36 迁移)→S7c(前端所见即所写+区分流不完整/为空)→S7d(切 Dify,依赖 Muse 专属 workspace)。
|
||||
|
||||
**S7 分支①实现进展(2026-07-08,里程碑 M2 达成)**:S7a/S7b/S7c 三步已落地并逐一独立验真(主权红线亲读核查 + 各步单测全绿)。
|
||||
- **S7a**(commit 916d6c87):`RuntimeResult` 加仅内存 `fullOutput`;两 real client 在派生摘要前捕获完整正文并跑护栏(空/超长/凭据痕迹/疑似截断,不信 provider finishReason);「审」上移到完整正文。主权三层亲验:content_snapshot 仍写摘要、findings 只含布尔/marker/长度、fullOutput 无持久化出口。ai 模块 79 用例绿。
|
||||
- **S7b**(commit fcd0623a):新增独立瞬态加密表 `muse_ai_generated_fulltext`(V36:AES 加密+TTL+决定即清),执行器写瞬态 Store(不在终态 purge,出向存活到决定),投影在 done 前发 chunk 引用行(payload 只含 contentRef、绝不带正文),SSE `chunkData` 回 Store 取正文填 content,采纳/放弃即 purge。完整正文永不进 chunk payload/候选长期列(四重亲验)。ai 模块 528 用例绿。
|
||||
- **S7c**(commit 43a08624):纯前端。采纳恒走 merge_after_edit+finalContent=用户审定完整正文(改没改都送),Canonical 由客户端回传写入,修掉「原样采纳写摘要」潜伏缺陷;流健壮性三分(happy/疑似截断提示重生成/流空标 degraded 警告)。**MSW-off e2e 真后端+真 New-API 端到端证实 Canonical content_text===客户端 finalContent**、revision 递增。tsc/vitest 121/build/lint/e2e 全绿。
|
||||
- 真 PG 一次真生成经护栏+chunk 携全文+决定后 purge+重连回取的整链冒烟,并入 M1 由主会话跑现有 harness(避免新造 P1r live IT 触发内容过滤器)。
|
||||
剩余:**S7d**(生成 provider 切 Dify,workspace 已就绪);S6a 端口重命名主树重做中(此前 worktree 隔离基线陈旧 320 commit 作废,教训入个人记忆)。
|
||||
|
||||
**E1 content 创作闭环切片(2026-06-27)**:已补 AI suggestion 采纳归档、前端“改后合并”入口、IndexedDB 草稿键对账、旧知识草稿失效、工作台知识/导入/导出/记录入口、Block 版本历史最小 API/UI。Content merge 写 Canonical 与来源归因后,必须由 AI owner 写 `accepted` 状态、accepted decision archive、AI command、business audit;AI owner 不可用时整笔 merge 回滚,避免 Canonical 已写但候选仍 pending。Content 正文变更后通过 Knowledge owner API 将关联 pending draft 标为 `conflicted/needs_recheck` 并写 Knowledge draft decision archive;通知失败不回滚 Canonical 主写,Knowledge confirm 端仍按来源状态 fail-closed。Studio `CandidatePanel` 支持编辑最终正文并按 `accept_as_is`/`modify_then_merge` 提交,IndexedDB 草稿键改为 `workId+blockId+revision` 防跨作品/版本污染。`saveBlock`/`mergeBlockSuggestion` 现在写 `muse_content_block_revision_snapshot`,工作台“历史”Tab 只读展示 Canonical revision 快照;导入可创建真实任务,导出支持范围/格式选择、任务查询与下载凭证消费,知识/记录入口跳转对应工作台。fresh 证据:后端局部单测 `ContentSourceServiceTest` 25/0F/0E、`ContentAppServiceTest` 19/0F/0E、`MuseKnowledgeDraftInvalidationServiceTest` 3/0F/0E、`AiSuggestionMergeProjectionFacadeTest` 7/0F/0E;契约/覆盖门 `ContractFirstGateTest` 4/0F/0E + `P1rApiCoverageReportTest` 8/0F/0E;real-PG `P1rContentCoreCompletedApprovalIT` 13/0F/0E/0S + `P1rContentMergeSuggestionIT` 5/0F/0E/0S + `P1rContentMergeGeneratedSuggestionIT` 1/0F/0E/0S;studio `tsc -b --force` 通过、lint 0 errors、Vitest 12/12,追加 `AIPanel.contract.test.tsx` + `sse.test.ts` 22/0F/0E;导出 UI 追加 `useWorks.test.tsx`+`ExportWorkModal.test.tsx` 11/0F/0E、目标 ESLint 0 errors。共享 PG 写入闸门批准后已补跑 MSW-off Playwright 真后端 `accept-suggestion.spec.ts` 2/0F/0E:正路真 New-API 生成 suggestionId=79、authz `rpe-local-*`、Block revision 160→161、AI owner accepted decision archive 非空;负路 stale revision 业务冲突。边界:`muse-studio/src/types/content.ts` 生成类型因 openapi-typescript 版本漂移未同步,hook 内暂维护 `BlockRevision` 最小类型;完整导入向导已在 RC 后补,见下方记录;真后端导出下载 e2e 已在 2026-06-28 补跑通过,FileApi 异常仍按后端合同 fail-closed。
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user