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:
lili 2026-07-08 00:55:32 -07:00
parent 43a08624f8
commit 0451549829

View File

@ -41,7 +41,14 @@
**2.0.0 单人版改造 S7.0 输出契约裁决(2026-07-07)**:在 live 单体(真 48080 + 真 New-API上取全 plan 要求的三项证据后裁定 **S7 走分支①(建运行时不落库全文通路)**,项目所有者 2026-07-07 确认。证据①SSE 流——后端不发 chunkhistogram chunk=0dispatcher 同步生成完整文本后只写一条 `done``MuseAiTaskStreamServiceImpl.doneData` 只带 `{taskId, suggestionId, summary?}`,全文不经 SSE②UI——CandidatePanel 凭 suggestionId 走 `GET /suggestions/{id}``data.content`③DB——`muse_ai_suggestion.content_snapshot.content` 实测仅 5060 字脱敏摘要(键 `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`V36AES 加密+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 切 Difyworkspace 已就绪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 auditAI 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/0Ereal-PG `P1rContentCoreCompletedApprovalIT` 13/0F/0E/0S + `P1rContentMergeSuggestionIT` 5/0F/0E/0S + `P1rContentMergeGeneratedSuggestionIT` 1/0F/0E/0Sstudio `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。