Files
Agent-System/.doc/remediation/2026-09-13-chat-history-refresh-remediation.md
T
WeiCHEN 794656224c docs(ops): clarify CHAT-HISTORY-REFRESH reconcile residual notes
Cite B3 gate as closed evidence; keep only transport-cache UX as residual; mark remediation INDEX done.
2026-09-22 21:27:51 +08:00

4.9 KiB
Raw Blame History

title, status, created, updated
title status created updated
对话刷新恢复与阶段授权一致性整改方案 done 2026-09-13 2026-09-22

对话刷新恢复与阶段授权一致性整改方案

关闭说明(2026-09-22)

本方案关闭(缺口级 done)。 tip 364ed7f1 代码与归档报告证明原发布缺陷已修;SSOT 见 gap-matrix CHAT-HISTORY-REFRESH = PASS。

三方口径裁定:ops/short-term/2026-09-22-chat-history-refresh-reconcile.md。

红线仍 enforced:无空 stage_key 一律放行;无前端 localStorage 掩盖服务端空/错作为成功态。

背景

审计确认消息正文仍在 PostgreSQL,但文档任务消息和激活前历史缺少工作流阶段作用域;刷新后的窗口接口将其全部过滤,而分类/日期统计仍返回全量结果。详见 审计记录。

目标

  1. 同一登录用户在权限未变化时,刷新、重新登录和服务重启后看到一致的对话正文、数量、日期、搜索和锚点。
  2. 每条新消息在服务端落库时拥有可审计的会话、项目及工作流作用域;客户端不得决定该作用域。
  3. 所有历史读取入口使用同一对象级与阶段级授权规则,统计集合必须与正文集合一致。
  4. 安全回填现有可唯一归属的消息,不丢失正文,不扩大不可确定历史的可见范围。

分波次计划

波次 内容 状态
Wave 0:锁定回归 PG/单测覆盖激活前 + 任务作用域 + guest 负例 done(chat_history_refresh_pg_test.go、message_scope_test.go)
Wave 1:统一服务端作用域 服务端解析并写入 scope_kind / 实例 / stage_key done(message_scope.go、task/chat 写入路径)
Wave 2:修正授权查询 chatflow / chat_history_auth 统一 MessageRecordVisible done
Wave 3:历史迁移 goose 00026 列 + 00027 回填 done(迁移在库)
Wave 4:前端恢复态 authorized_empty / forbidden / error;空桶/403 清缓存 done(网络错误 cache→ready 为残留 UX,另账)
Wave 5:全链验收 闲聊 live + 门禁 B3(activate+task+rebuild) done(B3)

红线(持续)

  • 消息作用域只由服务端解析;忽略客户端伪造身份字段。
  • MessageVisible:Restricted 下空 stage_key 仅 session owner;禁止一律放行。
  • 前端不得用 localStorage 把服务端 authorized-empty / 错误呈现为成功窗口。

验收标准

  • 创建项目会话并发送普通消息,刷新后用户/助手两条正文、顺序、类别和锚点不变。 — 6252 live
  • 先聊天再激活工作流,刷新后激活前 owner 私聊仍按既定策略可见。 — PG TestChatHistoryRefresh + B3 6359
  • 激活后通过后台任务生成文档,任务消息刷新后完整恢复。 — B3 pi_task_refresh window_msgs=4
  • 工作流阶段可见性策略(Restricted / 非允许 stage 隐藏)。 — MessageVisible 单测;推进后长链 E2E 非本 gap 强制项
  • window/categories 等同谓词同集;guest 403。 — 6252 / 6359 live;MessageRecordVisible 共用
  • 非会话 owner 读窗口 403。 — guest SESSION_FORBIDDEN
  • 刷新 / rebuild 后不依赖未授权 localStorage 恢复正文。 — restart.json 4→4;403/空桶清缓存
  • 历史迁移路径在库(goose 00027);零正文删除策略。 — 迁移文件;独立 dry-run 报表缺档记残留
  • 相关自动化:本裁定重跑 MessageVisible/ChatHistory short PASS;历史全量 short/npm test 见原报告
  • 真实 PI 文档任务后刷新 E2E。 — B3 gate

残留(不回退 gap)

  1. useChatWindow 非 403 catch 仍可能 cache→ready(降级 UX);后续禁止扩大。
  2. StageKeyAllowed("")==true 在非聊天调用点另账。
  3. goose 00027 缺独立 dry-run 对账 Markdown 附件。

相关链接