Cite B3 gate as closed evidence; keep only transport-cache UX as residual; mark remediation INDEX done.
4.9 KiB
4.9 KiB
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,但文档任务消息和激活前历史缺少工作流阶段作用域;刷新后的窗口接口将其全部过滤,而分类/日期统计仍返回全量结果。详见 审计记录。
目标
- 同一登录用户在权限未变化时,刷新、重新登录和服务重启后看到一致的对话正文、数量、日期、搜索和锚点。
- 每条新消息在服务端落库时拥有可审计的会话、项目及工作流作用域;客户端不得决定该作用域。
- 所有历史读取入口使用同一对象级与阶段级授权规则,统计集合必须与正文集合一致。
- 安全回填现有可唯一归属的消息,不丢失正文,不扩大不可确定历史的可见范围。
分波次计划
| 波次 | 内容 | 状态 |
|---|---|---|
| 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_refreshwindow_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/ChatHistoryshort PASS;历史全量 short/npm test见原报告 - 真实 PI 文档任务后刷新 E2E。 — B3 gate
残留(不回退 gap)
useChatWindow非 403 catch 仍可能 cache→ready(降级 UX);后续禁止扩大。StageKeyAllowed("")==true在非聊天调用点另账。- goose 00027 缺独立 dry-run 对账 Markdown 附件。
相关链接
- Audit: ../audit/2026-09-13-chat-history-refresh-disappears.md
- Reconcile: ../ops/short-term/2026-09-22-chat-history-refresh-reconcile.md
- Handoff: ../ops/handoffs/2026-09-13-chat-history-refresh-diagnosis.md
- B3: ../test-reports/2026-09-16-chat-refresh-gate-test-report.md
- gap-matrix 行:
CHAT-HISTORY-REFRESH