Compare commits
8
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a73c84b5be | ||
|
|
05c13a42b1 | ||
|
|
53354996f2 | ||
|
|
cf74a200e8 | ||
|
|
f7ae1ecce6 | ||
|
|
b184bfb109 | ||
|
|
f76cce9e32 | ||
|
|
8d8600024d |
@@ -8,9 +8,9 @@ product_contract_source: ce-plan-bootstrap
|
|||||||
|
|
||||||
# 多人协作存储与分布式演进方案 - Plan
|
# 多人协作存储与分布式演进方案 - Plan
|
||||||
|
|
||||||
修订:r2.2;确认状态:**已批准(2026-10-11 用户指示「按方案开始改造」)**;推进状态:U1–U7 **代码与测试已合入**(Backend [#164](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Backend/pulls/164);Dev [#410](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/410)/[#439](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/439)/[#442](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/442);闭卡 [#424](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/424) 等)。正确性 A1–A7 与 B1 已绿(CI/SELF)。容量合同 B2/B3/B5 contract 与双实例 C2 **本机 SELF 窗口已跑通**(见[容量报告](../records/2026-10-12-u7-capacity-window-report.md))。2026-10-12 用户决定不做容量重放;同日 B6 pgbench、C4 断连、C5 库恢复已有本机 SELF(见[运维演练报告](../records/2026-10-12-u7-ops-drill-report.md)),C5 工件恢复 K4 失败。**SELF≠GATE/REPLAY**,双主机 C3 未做——**仍不放行第二实例承接写请求**。
|
修订:r2.3;确认状态:**已批准(2026-10-11 用户指示「按方案开始改造」)**;推进状态:U1–U7 **代码与测试已合入**(Backend [#164](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Backend/pulls/164);Dev [#410](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/410)/[#439](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/439)/[#442](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/442);闭卡 [#424](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/424) 等)。正确性 A1–A7 与 B1 已绿(CI/SELF)。容量合同 B2/B3/B5 contract 与双实例 C2 **本机 SELF 窗口已跑通**(见[容量报告](../records/2026-10-12-u7-capacity-window-report.md))。2026-10-12 用户决定不做容量重放;同日 B6 pgbench、C4 断连、C5 库恢复已有本机 SELF(见[运维演练报告](../records/2026-10-12-u7-ops-drill-report.md))。2026-10-13 未配置对象存储时的上传 panic 已修,C5 工件恢复 K4 重测为 SELF 通过。**SELF≠GATE/REPLAY**,双主机 C3 未做——**仍不放行第二实例承接写请求**。
|
||||||
需求来源:2026-10-11 用户要求完善 SQLite、PostgreSQL/pgvector、Redis 分工;随后确认“10–100 人,多人多项目多会话并行,未来支持多服务分布式”。
|
需求来源:2026-10-11 用户要求完善 SQLite、PostgreSQL/pgvector、Redis 分工;随后确认“10–100 人,多人多项目多会话并行,未来支持多服务分布式”。
|
||||||
需求负责人:weichen;方案编制:Codex;实施及运维负责人:待指定。更新时间:2026-10-12(Asia/Shanghai)。
|
需求负责人:weichen;方案编制:Codex;实施及运维负责人:待指定。更新时间:2026-10-13(Asia/Shanghai)。
|
||||||
关联任务:方案与 U1–U7 实施卡已归档;容量收尾见 Dev `.task/feature-u7-capacity-wrap-measure.md`。放行检查单:Dev `docs/release-multi-instance.md`。
|
关联任务:方案与 U1–U7 实施卡已归档;容量收尾见 Dev `.task/feature-u7-capacity-wrap-measure.md`。放行检查单:Dev `docs/release-multi-instance.md`。
|
||||||
正文中的源码路径以 Agent-System-Dev 为根;工作包中的 `internal/` 简写指 `modules/backend/internal/`;文内相对链接以本文为根。
|
正文中的源码路径以 Agent-System-Dev 为根;工作包中的 `internal/` 简写指 `modules/backend/internal/`;文内相对链接以本文为根。
|
||||||
|
|
||||||
@@ -246,8 +246,8 @@ SQLite 本身支持可靠事务与多人经同一应用访问;WAL 提升读写
|
|||||||
|
|
||||||
必需观测:API P95/P99与预期/非预期错误,DB pool wait/连接数/慢查询/锁等待,队列长度/最老年龄,run 租约/过期写拒绝/未知副作用,SSE cursor lag/补查次数,Redis 错误与降级,检索耗时/召回抽样,备份时间与恢复结果。日志只记录 request/run/owner 的安全标识,不记录 DSN、密钥或文档正文。
|
必需观测:API P95/P99与预期/非预期错误,DB pool wait/连接数/慢查询/锁等待,队列长度/最老年龄,run 租约/过期写拒绝/未知副作用,SSE cursor lag/补查次数,Redis 错误与降级,检索耗时/召回抽样,备份时间与恢复结果。日志只记录 request/run/owner 的安全标识,不记录 DSN、密钥或文档正文。
|
||||||
|
|
||||||
r1 为方案与 SELF 调查记录。r2 起:U1–U7 代码与测试已合入且正确性 CI 绿。r2.1:本机双实例 contract 容量窗口(ladder / 60m / 2h)SELF 全过,见[容量报告](../records/2026-10-12-u7-capacity-window-report.md)。r2.2:用户于 2026-10-12 明确不做容量重放;同日完成 B6 pgbench、C4 PG/Redis 断连、C5 物理备份与 pg_dump 恢复的本机 SELF,见[运维演练报告](../records/2026-10-12-u7-ops-drill-report.md)。C4 通过。C5 的库恢复通过(RPO 64 秒,RTO 4 秒),工件上传在未配置对象存储时 panic,K4 失败,产品代码未改。本地 SELF 不能冒充 GATE/REPLAY 放行;双主机仍缺。部署与第二实例写流量仍未授权。
|
r1 为方案与 SELF 调查记录。r2 起:U1–U7 代码与测试已合入且正确性 CI 绿。r2.1:本机双实例 contract 容量窗口(ladder / 60m / 2h)SELF 全过,见[容量报告](../records/2026-10-12-u7-capacity-window-report.md)。r2.2:用户于 2026-10-12 明确不做容量重放;同日完成 B6 pgbench、C4 PG/Redis 断连、C5 物理备份与 pg_dump 恢复的本机 SELF,见[运维演练报告](../records/2026-10-12-u7-ops-drill-report.md)。C4 通过。C5 的库恢复通过(RPO 64 秒,RTO 4 秒),工件上传在未配置对象存储时 panic,K4 失败,产品代码未改。r2.3:2026-10-13 在 store 边界把带类型的空对象存储当作未配置并回落本地目录;同日 C5 重测 K1–K7 均为 SELF 通过(RPO 65 秒,RTO 3 秒,K4 五个工件 sha256 一致且跨用户拒绝)。本地 SELF 不能冒充 GATE/REPLAY 放行;双主机仍缺。部署与第二实例写流量仍未授权。
|
||||||
|
|
||||||
方案静态审阅及修订处置见[审阅记录](../records/2026-10-11-collaboration-storage-plan-review.md)。进程级黑盒相对库级 Manager 测试的漏检教训见[经验条目](../records/2026-10-12-lesson-http-multi-instance-vs-manager-tests.md)。Agent 审阅不替代人工批准或实现验收。
|
方案静态审阅及修订处置见[审阅记录](../records/2026-10-11-collaboration-storage-plan-review.md)。进程级黑盒相对库级 Manager 测试的漏检教训见[经验条目](../records/2026-10-12-lesson-http-multi-instance-vs-manager-tests.md)。Agent 审阅不替代人工批准或实现验收。
|
||||||
|
|
||||||
首选下一增量不要自动开工。剩余放行门槛是:独立 REPLAY,或把 C4/C5 快速档接入 CI 形成 GATE(需平台准入);以及 C3 双主机(需第二台机器)。在此之前要先修上传缺陷:未设置 `BLOBSTORE_S3_ENDPOINT` 时,空的 `*S3` 被放进对象存储接口,上传 panic,C5 的 K4 因此失败。GATE/REPLAY 与 C3 未齐、K4 未重测通过前,不要开放第二实例写。各实现任务启动前复核在途 PR 与依赖 SHA,再按 Dev 的 evidence/task-sync/组合验证流程交付。
|
首选下一增量不要自动开工。剩余放行门槛是:独立 REPLAY,或把 C4/C5 快速档接入 CI 形成 GATE(需平台准入);以及 C3 双主机(需第二台机器)。2026-10-13 的上传修复与 K4 SELF 重测不替代这两项。GATE/REPLAY 与 C3 未齐前,不要开放第二实例写。各实现任务启动前复核在途 PR 与依赖 SHA,再按 Dev 的 evidence/task-sync/组合验证流程交付。
|
||||||
|
|||||||
@@ -0,0 +1,176 @@
|
|||||||
|
---
|
||||||
|
title: 面向非专业用户的工作台整体界面重设计
|
||||||
|
revision: r0.2
|
||||||
|
status: approved-for-continuous-implementation
|
||||||
|
date: 2026-10-12
|
||||||
|
owner: weichen
|
||||||
|
scope: requirements-and-design
|
||||||
|
implementation: implemented
|
||||||
|
delivery: tracked-in-dev-task-record
|
||||||
|
project-record: persisted
|
||||||
|
---
|
||||||
|
|
||||||
|
# 工作台整体界面重设计 r0.2
|
||||||
|
|
||||||
|
用户在评审 r0.1 后明确授权“开始实施直到完成”。本稿 r0.2 保留已选设计,并通过本次独立任务连续实施、验证、Review 与合入。已有快慢通道执行方案的其他增量不由界面授权自动扩大。
|
||||||
|
|
||||||
|
## 1. 设计目标
|
||||||
|
|
||||||
|
让不懂命令、脚本、模型和代理的用户,通过表达目标、提供材料、查看结果、完成必要确认来推进工作。
|
||||||
|
|
||||||
|
默认界面回答三件事:现在在做什么,已经得到什么,下一步是否需要我处理。用户能够只用对话完成主要工作,也能在需要时展开工作摘要、阅读文件、核对依据。
|
||||||
|
|
||||||
|
用户明确要求:不要过于复杂;以辅助工作为中心;渐进、多层级展示;减少命令和脚本细节;大气、现代、简约、美观、易用。
|
||||||
|
|
||||||
|
本稿的场景假设:主要工作包括材料整理、分析比较、问题审查和文档生成,兼顾日常问答。业务领域的具体审批和发布入口按当前服务端能力提供。
|
||||||
|
|
||||||
|
## 2. 推荐形态与备选
|
||||||
|
|
||||||
|
推荐**渐进展开的三栏工作台**。左侧找项目与历史,中间通过对话推进工作,右侧按需处理工作或文件。普通问答默认收起右栏,复杂工作时提供概览;用户手动收起后不因普通更新反复打开。
|
||||||
|
|
||||||
|
| 形态 | 适用和取舍 | 本稿选择 |
|
||||||
|
|---|---|---|
|
||||||
|
| 渐进三栏 | 对话入口清晰,复杂任务可展开,文件有稳定位置 | 推荐 |
|
||||||
|
| 纯对话 | 学习成本低;长文件、并行工作和多次确认容易淹没在历史消息中 | 作为轻量状态 |
|
||||||
|
| 总览仪表盘 | 跨任务监控方便;默认要求用户理解更多指标和导航 | 仅在确有项目总览需求时另审 |
|
||||||
|
|
||||||
|
不单独建设快通道页、慢通道页或后台管理页。新增功能先判断能否放进现有对话、工作和文件入口。
|
||||||
|
|
||||||
|
## 3. 界面布局
|
||||||
|
|
||||||
|
**左栏:上下文。** 项目身份集中出现一次;新建对话、最近对话、搜索;文件和已启用的领域工作区放底部;账户与个人设置沉底。管理员操作只由管理员入口提供。
|
||||||
|
|
||||||
|
**中栏:推进工作。** 当前对话标题;用户的目标和材料;助手的结论、简短说明、必要动作;输入区上方一条工作状态。附件入口始终易找。权限设置保留清晰入口,展开说明其实际含义;初次使用采用现有默认值,不暗中扩大授权。
|
||||||
|
|
||||||
|
**右栏:工作 / 文件。** 工作按需要你处理、当前关注的工作、其他进行中或排队、新成果排列。完成历史收纳后仍可找回。文件负责列表、预览、编辑和下载;全屏阅读是同一个预览的放大。来源点击也进入同一预览对象,定位能力不足时说明定位范围。
|
||||||
|
|
||||||
|
左栏约 200–240,工作右栏约 320–420,中央弹性。正式落地继续消费已有拖拽宽度和文件阅读档规则。空间不足时先隐藏辅助栏;手机显示一个主视图,工作和文件按需打开,并有明确返回对话入口。
|
||||||
|
|
||||||
|
## 4. 渐进展示层级
|
||||||
|
|
||||||
|
| 层级 | 显示内容 | 打开方式 |
|
||||||
|
|---|---|---|
|
||||||
|
| L0 概览 | 后台工作数量、必要确认、新成果 | 一条状态行或小徽标 |
|
||||||
|
| L1 摘要 | 业务目标、真实状态、当前工作、最多 3 条重要发现、缺项、下一步 | 当前任务卡或对话锚点 |
|
||||||
|
| L2 依据与范围 | 阶段结果、来源、覆盖范围、未决问题和结论更正 | 原位置展开 |
|
||||||
|
| L3 执行记录 | 按工作阶段分组的动作、结果和有权限查看的诊断信息 | 明确点击执行记录 |
|
||||||
|
|
||||||
|
默认 L0/L1,不展开所有任务。必要确认、重要限制和失败影响不能藏在 L2/L3。L3 不是模型内部思考的展示入口,也不改变日志和来源的访问权限。
|
||||||
|
|
||||||
|
示例任务卡:
|
||||||
|
|
||||||
|
> 整理三份项目材料 · 进行中
|
||||||
|
> 正在核对:会议结论与需求说明
|
||||||
|
> 当前发现:上线时间出现两种说法;3 项需求缺少验收条件
|
||||||
|
> 待核查:评审意见中的补充要求
|
||||||
|
> 查看依据与范围
|
||||||
|
|
||||||
|
没有阶段成果时诚实显示“尚无阶段结论,正在读取材料”。以上业务发现是示例数据,当前 U1 骨架并不证明已经具备真实阶段发现发布能力。
|
||||||
|
|
||||||
|
## 5. 快慢通道的连续体验
|
||||||
|
|
||||||
|
用户界面主要使用“助手正在处理”“后台继续整理”等业务语言。快通道是当前对话回合,慢通道是后台工作,不是由用户选择的快慢速度档位。
|
||||||
|
|
||||||
|
| 时刻 | 用户看到的内容 | 表述边界 |
|
||||||
|
|---|---|---|
|
||||||
|
| 发消息或材料 | 接收结果、可先回答的内容、接下来处理的范围 | 已选文件不等于上传成功;解析不等于分析完成 |
|
||||||
|
| 任务登记或排队 | 同一工作对象显示已登记、排队中 | 登记成功才能说已登记;未开跑不能写进行中 |
|
||||||
|
| 工作进行中 | 当前工作、真实阶段结果、缺项 | 没有可信进度就不显示百分比或预计完成时间 |
|
||||||
|
| 用户继续输入 | 后台继续工作时可继续对话;前台忙时说明消息排队 | 发送不等于即时执行,不承诺已改变正在跑的任务 |
|
||||||
|
| 有新成果 | 更新原卡;重要结果提供一条对话通知 | 不逐条回投工具动作,不把所有任务复制成另一条聊天流 |
|
||||||
|
| 等待用户 | 操作、范围、影响和明确选择 | 等待、执行、生成、用户认可和正式发布分开 |
|
||||||
|
| 完成或失败 | 结论、最多 3 个要点、范围或缺项、文件和下一步 | 保存失败不得声称已交付;部分完成不能冒充完整结果 |
|
||||||
|
|
||||||
|
后台更新不切换用户正在读的文件,不抢焦点,不把历史阅读强行滚到底部。状态恢复期间保留最后已知内容并注明“正在重新连接,最新进展待确认”。
|
||||||
|
|
||||||
|
## 6. 按工作选择展示形式
|
||||||
|
|
||||||
|
统一骨架保持稳定,内容形态随任务改变。默认由工作目的决定,用户无需先学习或配置一种展示模式。
|
||||||
|
|
||||||
|
| 工作 | 默认成果形式 | 进一步展开 |
|
||||||
|
|---|---|---|
|
||||||
|
| 简单问答 | 一段结论,必要说明 | 依据与例子 |
|
||||||
|
| 材料整理 | 主要结论、问题和缺项 | 材料覆盖清单、来源 |
|
||||||
|
| 方案比较 | 一条建议、关键差异表 | 判断依据、取舍和适用条件 |
|
||||||
|
| 问题审查 | 按影响排列的问题清单 | 原文、影响、处理建议 |
|
||||||
|
| 文档生成 | 草稿文件、完成范围、需要评审的事项 | 文件预览与后续修订 |
|
||||||
|
| 多步骤流程 | 当前阶段、已完成阶段、必要动作 | 阶段结果与历史 |
|
||||||
|
| 用户确认 | 简明操作说明、影响、选择 | 参数与诊断详情 |
|
||||||
|
|
||||||
|
图表仅在数量、趋势或关系能帮助判断时使用;可理解的短表不升级成图表。生成式任务页面作为可选增强,关闭插件后仍能通过任务卡、文字和文件读到主要结果。领域审批不能成为所有基座任务的固定步骤。
|
||||||
|
|
||||||
|
## 7. 等待确认与异常
|
||||||
|
|
||||||
|
确认卡先写操作及影响,例如“依据三份材料新增 1 份项目草稿,保留原件,不对外发送”。涉及覆盖、发送、发布或权限变化时,关键对象和影响必须在默认层显示。避免只有“是否执行”而没有范围。
|
||||||
|
|
||||||
|
对话和右栏操作同一确认对象。提交中阻止重复提交;已处理同步更新;超时显示“正在核实处理结果”,查清后再允许后续动作。示例稿只演示本地状态同步,不证明服务端幂等和恢复。
|
||||||
|
|
||||||
|
异常表述使用“发生了什么 → 对结果的影响 → 用户可以做什么”。例:“评审意见未能读取;已整理另外两份材料,完整结论尚未生成;可补充清晰版本或先讨论已有结果”。错误代码、脚本与输出置于授权可读的详情。动作只按服务端当前能力显示;未核验的暂停、独立取消、续跑、自动重试不进入默认设计。
|
||||||
|
|
||||||
|
## 8. 视觉规则
|
||||||
|
|
||||||
|
沿用 DESIGN.md 和 @ui/tokens.css:灰白表面阶梯、单色反色主按钮、发丝边框、克制语义色;清晰的标题与正文层级;常用信息保持可读,不以缩小字号装下所有内容。
|
||||||
|
|
||||||
|
大气来自稳定分栏、整齐对齐、合理阅读行长和区块间距;简约来自减少同时出现的内容。没有营销式大标题、装饰渐变、速度表盘、满屏彩色卡片或默认工具日志。
|
||||||
|
|
||||||
|
字型走 --fs-ui-*,界面字号可调。状态同时有文字和形状。折叠消费 @ui Collapsible,动效只用 mk-* 并响应减少动效。交互稿复制固定 UI 令牌,实际使用当前 Collapsible 源码与 MotionKit,不新建颜色和动效体系。
|
||||||
|
|
||||||
|
## 9. 当前依据与依赖
|
||||||
|
|
||||||
|
本轮只读源码核对,来源 SELF;没有对生产或当前 dev 服务作功能验收。
|
||||||
|
|
||||||
|
| 对象 | 固定提交 | 核对点 |
|
||||||
|
|---|---|---|
|
||||||
|
| Dev | 4d362537d0e8755a03b1757b5bad92779a064b33 | DESIGN.md、policy/delivery.md、既有规划 |
|
||||||
|
| Frontend | 1edd872c554f666ba43353da7e6f0605ecec311b | Workbench.tsx、Conversation.tsx、Workspaces.tsx |
|
||||||
|
| Backend | acabb85e2ae970f834defae916c7539d0a47993d | spawnBackgroundOpts、CancelRun、createBackgroundCard、finishBackgroundCard |
|
||||||
|
| UI | 83e80f5648649c3cc070f4dbc6bf118996828ae8 | tokens.css、Collapsible.tsx、motion.css |
|
||||||
|
| Documents | 3cc6438030803b8e2355d2867766e9654203f265 | 快慢通道展示 r1.1 及 U1 实施计划 |
|
||||||
|
|
||||||
|
当前读到的源码已有三栏“工作 / 文件”、前台忙时输入排队、后台并行限制、排队工作、精炼卡片骨架以及失败 CardFailed 映射。这里只说明源码形状,不推断已部署与运行表现。
|
||||||
|
|
||||||
|
与既有方案衔接:`modules/documents/docs/proposals/2026-10-12-fast-slow-channel-display.md` 是快慢通道摘要与异步投影的已有主记录;本稿补充整体交互与各种成果形式,不另起一套状态或快照契约。U2/U3/U4 的真实阶段发现、持久恢复、确认闭环和窄屏完善继续以原记录及后续批准为准。
|
||||||
|
|
||||||
|
## 10. 实施需求
|
||||||
|
|
||||||
|
以下为本次界面实施与验收范围;实现消费真实已有能力,不伪造尚未发布的阶段发现。
|
||||||
|
|
||||||
|
| ID | 需求 | 优先级 | 可判定的验收方向 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| UI01 | 对话能完成主要工作 | P0 | 关右栏仍能读摘要、核对依据、处理确认、打开成果 |
|
||||||
|
| UI02 | 普通问答保持轻量 | P0 | 无后台工作时不生成空任务卡和空进度条 |
|
||||||
|
| UI03 | 默认内容可支持下一步 | P0 | 用户能说明当前工作、结果范围、必要下一动作 |
|
||||||
|
| UI04 | 快慢通道连续展现 | P0 | 前后台并行、排队和完成状态归属正确且不重复刷屏 |
|
||||||
|
| UI05 | 四层渐进阅读 | P0 | 默认无命令日志,关键限制和确认不被折叠藏起 |
|
||||||
|
| UI06 | 成果按目的呈现 | P1 | 整理、比较、审查和生成各能支持对应工作判断 |
|
||||||
|
| UI07 | 状态与动作忠实 | P0 | 不伪造进度,不暴露未支持控制,不把失败显示成功 |
|
||||||
|
| UI08 | 同一文件同一预览 | P0 | 对话、来源、文件列表均进入同一预览位置 |
|
||||||
|
| UI09 | 确认结果一致 | P0 | 双入口、重复点击、超时未知和已处理均有一致表现 |
|
||||||
|
| UI10 | 阅读稳定 | P0 | 普通后台更新不抢焦点、换文件或改阅读位置 |
|
||||||
|
| UI11 | 窄屏和大字可用 | P0 | 320/390/736/1024/1440 及 18px 字号必要动作可达 |
|
||||||
|
| UI12 | 遵守设计系统 | P0 | 令牌、Collapsible、MotionKit、对比度守护符合规范 |
|
||||||
|
| UI13 | 能力与权限匹配 | P0 | 未启用领域入口不显示;摘要与来源不绕过访问控制 |
|
||||||
|
|
||||||
|
最终产品验收场景:三个附件无文字发送;前后台并行及排队;确认双入口;完整/部分/失败结果;查看来源与文件;刷新和断线;新对话;窄屏、大字、键盘及减少动效。r0.1 设计评审时,真实模型、真实后端和真实浏览器任务验收均为 NOT_RUN;实施期结果见第 13 节,示例交互稿不能代替验收。
|
||||||
|
|
||||||
|
## 11. 落地次序建议
|
||||||
|
|
||||||
|
1. **整体界面与文案。** 在既有三栏和 U1 上整理默认内容、必要操作和阅读路径。优先确定 UI01–UI03/UI05/UI08/UI12;不在此增量改变后台执行契约。
|
||||||
|
2. **动态工作摘要。** 接续既有快慢通道 U2/U3,在真实快照与检查点之上显示业务发现、范围和恢复状态;避免另外安排重复任务。
|
||||||
|
3. **成果形式与适配。** 衔接 U4,完成比较、审查、可选任务页面、窄屏和具体领域入口。先用结构化文字/表格,再增强生成式展示。
|
||||||
|
|
||||||
|
r0.1 布局与展示已获连续实施授权,当前按 r1 计划交付界面。完成本增量后的首选衔接仍是既有快慢通道 U2/U3 的真实阶段发现与恢复验收;需先核对其在途任务和批准范围,不能由本界面任务重复启动或改变路由。
|
||||||
|
|
||||||
|
## 12. 授权与实施记录
|
||||||
|
|
||||||
|
来源:2026-10-12 用户在本聊天评审 r0.1 后指示“开始实施直到完成”。模式 authorized-continuous;阶段 1–10 在本稿界面范围内连续推进,平台门禁和高后果双钥匙保留。启动检查从已登记干净 Dev 检出捕获,后由 make task-start 创建 feature/work-companion-ui,并导入原始 SELF 收据。保护主检出的 Frontend 更新与其他任务现场。
|
||||||
|
|
||||||
|
实施计划见 [r1](2026-10-12-work-companion-ui-plan.md);进展和原始证据仅维护于 Dev .task/feature-work-companion-ui.md。PR、CI、Review、合入与部署分别记载,不因本授权预先标为通过。
|
||||||
|
|
||||||
|
## 13. 实施进展与能力边界
|
||||||
|
|
||||||
|
2026-10-12:渐进任务卡、轻量对话/输入、响应三栏和单一异步状态投影已形成可审阅候选。SELF 验证包括 Frontend 210 与 UI 155 单元测试、类型/设计守护/knip、Dev make test 与 make build;现有 Playwright 11 个展示场景、6 个移动导航场景及隔离 HTTP/MockRunner 2 个真实接口链路场景通过。原始命令、精确对象和完整输出以 Dev 任务卡为准,测试成功不推断已经合入或部署。
|
||||||
|
|
||||||
|
原始独立代码 Review 已完成,必要问题均已有整改候选;最终精确版本复审、组合 CI 与合入进展只维护在 Dev 任务主记录,方案正文不复制第二份交付状态。UI 仓原 CI 在下载 GitHub action 时失败,交付补充改用既有平台固定 SHA 检出和 Node22 镜像,保留原测试;安全和规范 Review 及实际平台结果均须记录。
|
||||||
|
|
||||||
|
动态摘要只消费系统发布的真实内容:缺少阶段发现时显示诚实占位,不生成示例百分比、ETA 或虚构成果。真实模型阶段发现质量 NOT_RUN,后台自动路由和模型提示词未在本增量修改。旧运行服务未更新;最终组合、Review、GATE 和本任务安全收口以 Dev 主记录为准。
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
# Work companion interface implementation plan r1
|
||||||
|
|
||||||
|
> **For agentic workers:** Implement in independent units with ce-work native workers; the orchestrator owns integration, evidence, commits, Review and Gitea delivery. Use test-first coverage for behavior changes. User authorization: “开始实施直到完成”; continuous execution is limited to the approved interface design.
|
||||||
|
|
||||||
|
**Goal:** Deliver the approved simple, modern, progressive workbench through real project, conversation, activity-card, confirmation and file APIs.
|
||||||
|
|
||||||
|
**Architecture:** Keep the three existing pane responsibilities. Project existing ActivityCard bodies into readable summaries in the UI library; Frontend integrates them into conversation and work panes. Preserve server authority and harden event, query and action races in the one Frontend store. No new task executor, model routing, database schema or UI vocabulary is required.
|
||||||
|
|
||||||
|
**Tech Stack:** React 19, TypeScript, existing @ui Collapsible/MotionKit/tokens, Vitest, Playwright, Go backend with existing API and SSE.
|
||||||
|
|
||||||
|
**Spec:** [Approved interface design](2026-10-12-work-companion-ui-design.md), UI01–UI13; [existing fast/slow design](2026-10-12-fast-slow-channel-display.md), U1 skeleton and applicable presentation rules. Dynamic model-generated findings remain dependent on the existing U2/U3 work; this interface renders real available content and an honest placeholder otherwise.
|
||||||
|
|
||||||
|
## Global constraints
|
||||||
|
|
||||||
|
- Settled user decision: three pane workbench, conversation first, “工作 / 文件” in the same right pane, one preview object.
|
||||||
|
- Settled user decision: concise default content and progressive depth; necessary confirmation and outcome limits stay visible.
|
||||||
|
- Colors/radii/type consume @ui/tokens.css, type uses --fs-ui-*, motion only mk-*, folds use Collapsible.
|
||||||
|
- No percentage, ETA, pause, independent cancel, resume or retry buttons unless supplied by a verified server action.
|
||||||
|
- State is derived from real cards, runs, files and responses; no prototype example data enters production.
|
||||||
|
- Model internal thinking and command parameters/output do not occupy the normal reading layer.
|
||||||
|
- Main checkout and other task worktrees are protected. All owned changes live in feature/work-companion-ui.
|
||||||
|
- Evidence uses the Dev make evidence tool. Local checks are SELF; current PR HEAD CI is GATE.
|
||||||
|
- Component branches are based on their authoritative origin/main. Dev is based on R0 4d362537d0e8755a03b1757b5bad92779a064b33.
|
||||||
|
- No deployment/restart of existing services, data migration, credentials or branch-protection changes.
|
||||||
|
|
||||||
|
## Review focus
|
||||||
|
|
||||||
|
1. Older SSE frames or delayed queries must not replace newer cards or inject data into a different conversation/project.
|
||||||
|
2. Replay of a currently running conversation must still reconstruct its live output while duplicates are dropped.
|
||||||
|
3. A confirmation submitted through either view must block duplicate submission and represent unknown results honestly.
|
||||||
|
4. Closing auxiliary panes and opening files must leave necessary work and confirmation paths accessible at 320px and 18px UI type.
|
||||||
|
5. New background results must not take over an existing file, focus or reading position; result summaries must retain failure and coverage limits.
|
||||||
|
|
||||||
|
## U1 — Progressive activity cards and work groups
|
||||||
|
|
||||||
|
**Own files:** UI src/ActivityCardView.tsx, src/InlineConfirmCard.tsx, src/InboxList.tsx, src/index.ts, src/ui.css, new src/activitySummary.ts, src/ProgressCardBody.tsx and focused UI tests. Do not change generated contracts or tokens.
|
||||||
|
|
||||||
|
**Consumes:** Existing ActivityCard/UINode and DocBridge; U1 body keys 状态/正在做/当前发现/剩余/下一步. Unknown words remain supported by the generic renderer.
|
||||||
|
|
||||||
|
**Produces:** Existing ActivityCardView remains source-compatible; export activitySummary/cardStatusLabel/groupActivityCards as pure projections. CardViewCallbacks and InlineConfirmCallbacks may add `actionState?: (card: ActivityCard) => 'submitting' | 'unknown' | undefined`; existing callbacks remain optional. Core vocabulary is unchanged.
|
||||||
|
|
||||||
|
- [ ] Add tests for queued and running labels, modern failed and legacy done+danger, no-findings placeholder, internal material keys hidden by default, real document nodes still reachable, and confirmation buttons disabled for submitting/unknown.
|
||||||
|
- [ ] Run the focused Vitest tests before production edits; record expected red assertions through evidence.
|
||||||
|
- [ ] Build the projection with literal canonical body keys and card states; never interpret arbitrary output as a new execution fact.
|
||||||
|
- [ ] Render L1 summary first, remaining body and source/range information in Collapsible, diagnostic metadata behind a nested explicit record entry. Known failure/remaining/next-step content must remain visible.
|
||||||
|
- [ ] Keep unknown/legacy bodies intact in the generic detail renderer. Tables, structured lists and document references retain their current renderer.
|
||||||
|
- [ ] Group unpinned work as needs-action, active, results, history, preserving order inside each group. Pinned items remain stable.
|
||||||
|
- [ ] Simplify chrome; use text plus status shape and existing neutral surfaces.
|
||||||
|
- [ ] Verify full UI suite, tsc and design/contrast guards; hand off files and red/green evidence without committing.
|
||||||
|
|
||||||
|
Example behavioral expectation:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const queued = { ...card, status: 'active', body: [{ type: 'kv', kv: [['状态', '排队中'], ['材料键', 'mk_private']] }] }
|
||||||
|
expect(cardStatusLabel(queued)).toBe('排队中')
|
||||||
|
expect(groupActivityCards([completed, pending, queued]).map(g => g.key)).toEqual(['needs-action', 'active', 'results'])
|
||||||
|
```
|
||||||
|
|
||||||
|
## U2 — Conversation, input and inline work reading
|
||||||
|
|
||||||
|
**Own files:** Frontend src/components/Conversation.tsx, src/components/ProcessTimeline.tsx, src/messageparts.ts if required by process policy, new src/components/ConversationWork.tsx, new src/companion-conversation.css, focused conversation/messagepart tests. Do not edit styles.css, App, Workbench or store.
|
||||||
|
|
||||||
|
**Consumes:** Existing store fields and actions; existing UI ActivityCardView/Collapsible/DocBridge, including the additive actionState callback. The orchestrator supplies state.cardActionStates.
|
||||||
|
|
||||||
|
**Produces:** ConversationWork renders current cards from the same store in an inline Collapsible; default ordinary Q&A has no empty progress. Component CSS imports live in the owned component file.
|
||||||
|
|
||||||
|
- [ ] Add failing behavior tests for normal Q&A without progress, task summary reachable while right pane is closed, progress record folded by default, failure/limits visible, and process final answer outside its fold.
|
||||||
|
- [ ] Replace command-oriented empty states with goal/material prompts and three optional natural-language examples that fill input rather than trigger hidden work.
|
||||||
|
- [ ] Simplify header; keep execution profile, cross-reading and session settings inside a clearly labeled settings fold, preserving existing behavior and consent.
|
||||||
|
- [ ] Keep add-materials and send visible; move permission selector into operation settings without changing its effective value. Explain queue state and upload failures in user language.
|
||||||
|
- [ ] Show a light continuity line from real runs/cards with confirmed counts; inline work uses the same cards/actions as the work pane.
|
||||||
|
- [ ] Fold tool parameters and output even during running by default; keep a compact real phase label and preserve manual expansion. Do not display model internal thinking as ordinary content.
|
||||||
|
- [ ] Protect scroll reading and reset compose/expanded context correctly on conversation switches; do not remove artifact or rewind capabilities.
|
||||||
|
- [ ] Verify focused tests and the integrated Frontend suite; hand off files and evidence without committing.
|
||||||
|
|
||||||
|
Example behavioral expectation:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
expect(showProcessInline(live, true)).toBe(false)
|
||||||
|
expect(showProcessInline(live, false)).toBe(true)
|
||||||
|
// Render real ConversationWork with zero cards: no progress object is produced.
|
||||||
|
// Render with a real active progress card: summary is present independent of rightCollapsed.
|
||||||
|
```
|
||||||
|
|
||||||
|
## U3 — Responsive shell and context navigation
|
||||||
|
|
||||||
|
**Own files:** Frontend src/App.tsx, src/components/TopBar.tsx, src/components/TaskSidebar.tsx, new src/companion-shell.css, new src/workbenchLayout.ts and focused shell/layout tests. Do not edit store, Conversation, Workbench, shared styles.css or UI.
|
||||||
|
|
||||||
|
**Consumes:** Existing leftCollapsed/rightCollapsed/rightTab/previewExpanded and store pane/file operations. May add only local ephemeral responsive state, not another asynchronous task owner.
|
||||||
|
|
||||||
|
**Produces:** Desktop three pane layout; narrow screen one active pane with clear contextual return actions, using the same Workbench/PreviewPane objects. Export a pure layout selector if a decision is needed for tests.
|
||||||
|
|
||||||
|
- [ ] Write failing behavioral tests for single-pane navigation, restoring conversation, expanded file reading, and no hidden-only essential operation.
|
||||||
|
- [ ] Match the approved calm prototype through spacing and type hierarchy, preserving canonical palette and default existing theme preferences.
|
||||||
|
- [ ] Keep project identity on the left, conversation identity central, work/files on the right. Rename primary creation to 新建对话 where it actually creates a conversation.
|
||||||
|
- [ ] Reduce duplicate permanent chrome; retain project creation/search/account/admin/available workspace paths.
|
||||||
|
- [ ] Adapt to 320/390/736/1024/1440; hide/return controls remain keyboard- and touch-accessible. Do not let stored pane widths force horizontal overflow.
|
||||||
|
- [ ] Keep file expansion as one preview enlargement, not another overlay or fourth pane.
|
||||||
|
- [ ] Verify layout tests and report desktop/mobile screenshots after integration; hand off owned files without committing.
|
||||||
|
|
||||||
|
## U4 — One state owner, safe updates and confirmation feedback
|
||||||
|
|
||||||
|
**Own files:** Frontend src/store.ts, new src/eventProjection.ts if a pure helper is useful, src/components/Workbench.tsx, src/components/PreviewPane.tsx only when integration requires it, focused store tests. Orchestrator implements this unit.
|
||||||
|
|
||||||
|
**Consumes:** Existing SSE event identity/seq/runId, conversation detail resumeSeq/lastSeq, cards API, project events, cardAction and resolveHITL APIs.
|
||||||
|
|
||||||
|
**Produces:** Store `cardActionStates: Record<string, 'submitting' | 'unknown'>`; both work and inline confirmation callbacks read this same map. Current session/project cursors and query generation checks remain in one store.
|
||||||
|
|
||||||
|
- [ ] Add red tests for duplicated and stale cards; delayed conversation/project list queries after switching contexts; foreground replay versus background agent notes; duplicate action submission; unknown response followed by a server query; new Surface while reading a file.
|
||||||
|
- [ ] Guard event application by current context and per-stream applied sequence. Live replay uses its own replay cursor and never re-applies older card/plan/status projection effects.
|
||||||
|
- [ ] Guard asynchronous queries by their requested context and generation/sequence so slow snapshots do not wipe newer events or another context's state.
|
||||||
|
- [ ] Suppress background progress in foreground token output; update actual runs/cards instead of creating an unrelated LiveState.
|
||||||
|
- [ ] Lock confirmation/action submission by card or HITL identity before awaiting. Clear on observed server outcome. Unknown results remain disabled until read-only reconciliation determines the current state; do not blindly resend an effect.
|
||||||
|
- [ ] Show submitting and unknown feedback at both entrances. Preserve all server-supplied actions and their original scope.
|
||||||
|
- [ ] Leave current file/Surface selection and explicit pane preference intact on background updates; show a small new-result cue rather than auto-opening.
|
||||||
|
- [ ] Default new users to a light, compact conversation layout with right pane closed; keep saved theme/layout choices and explicit file opening.
|
||||||
|
- [ ] Verify focused store tests, integrated Frontend tests, and browser cross-view flows.
|
||||||
|
|
||||||
|
Example behavioral expectations:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
store.applyEvent({ ...newerStatus, seq: 12 })
|
||||||
|
store.applyEvent({ ...olderStatus, seq: 11 })
|
||||||
|
expect(store.getState().cards[0].status).toBe('done')
|
||||||
|
// Hold the first action response; call through the second view and assert one API request.
|
||||||
|
// Resolve or query the real returned card and assert both views leave submitting together.
|
||||||
|
```
|
||||||
|
|
||||||
|
## U5 — Integration, browser acceptance and delivery
|
||||||
|
|
||||||
|
**Own files:** Dev DESIGN.md, PROJECT.md, task card and exact gitlinks; Documents design/plan/index and delivery record; Frontend e2e/work-companion.playwright.ts and isolated browser fixtures if required; external screenshots and receipts.
|
||||||
|
|
||||||
|
- [x] Record authorization and implementation units; retain original startup evidence unchanged.
|
||||||
|
- [x] Integrate all workers, inspect owned paths and contracts, run authoritative focused tests, and commit logical component changes with Why/Evidence/Impact/Refs bodies.
|
||||||
|
- [x] Update DESIGN §9.6 and information architecture to the approved progressive behavior; no palette changes are planned, so do not change canonical token values merely to create a paired diff.
|
||||||
|
- [ ] Run make task-sync through evidence at acceptance, review and merge checkpoints; resolve any parent/component conflicts without altering unrelated owner work.
|
||||||
|
- [x] Pin exact committed component revisions and run Dev make test plus make build through evidence.
|
||||||
|
- [x] Browser checks: normal conversation; three selected attachments; background task plus foreground input/queue; pending confirmation through either entrance; done/failed/partial results; real file preview; reading preserved during update; duplicate/stale updates; refresh/switch; all five widths and 18px type.
|
||||||
|
- [x] UI fixture-driven browser cases validate presentation only. Use an isolated real backend/browser smoke for API wiring, file/confirmation/card persistence where feasible. No mock model findings are reported as live-model acceptance.
|
||||||
|
- [ ] Run required simplification and independent code review; fix findings, re-run affected checks, and record reviewer/object identity.
|
||||||
|
- [ ] Push component branches, create and attach Gitea PRs, verify their current HEAD required CI and merge in dependency order. Update Dev pins to merged revisions, verify combination CI at current Dev HEAD, Review and merge Dev PR.
|
||||||
|
- [ ] Fold/close only this task card under continuous authorization. Preserve or safely reclaim only owned workspace artifacts. Do not modify active main checkout state for other tasks.
|
||||||
|
|
||||||
|
## Definition of done
|
||||||
|
|
||||||
|
UI01–UI13 are mapped to observed source/tests/browser outcomes or an explicit inherited capability limit; no prototype fixture enters product state. All changed components compile and relevant tests pass. Current-head mandatory CI is verified before merge. Review findings are closed. The actual merged Dev combination and saved evidence are recorded. Existing running services remain unchanged; deployment is a separately identified operation.
|
||||||
|
|
||||||
|
Continuous authorization covers implementation, verification, reversible isolation, documentation, commit/push/PR, agent Review/merge and task-specific safe closure. Stops apply to genuine scope changes, unowned content collisions, missing current-head platform gates and high-consequence dual-key operations. These conditions do not require re-approval of routine already-authorized work.
|
||||||
|
|
||||||
|
## Delivery status
|
||||||
|
|
||||||
|
2026-10-12: U1–U4 implementation candidates are integrated; U5 local combination and browser checks passed as SELF evidence. Original independent review is complete; the required fixes are implemented and locally verified. Final fixed-version review, current-head platform CI/merge and safe closure are tracked only in the Dev task main record; this plan does not maintain a second delivery-status copy. Code review may produce small corrective iterations; each has its own fixed object and relevant replay. The UI CI bootstrap repair is required to run the retained checks, not a waiver of them. Actual merged versions and final verification remain recorded in the Dev task card; no existing service is deployed by this task.
|
||||||
|
|
||||||
|
2026-10-12 corrective candidate: UI0da2e3a / Frontend43d1933. SELF: UI155 and Frontend210 tests with type/knip checks, 11 presentation plus6 mobile-navigation browser cases,2 isolated realHTTP/MockRunner cases. The live attachment case now proves exact upload→send→persist associations across reload. The review repairs cover source links, per-option context, real browser scroll/focus, terminal reconciliation, action feedback ownership, explicit preview intent, latest outcomes and visible public explanations. These are interface and state-projection corrections; no live-model routing, prompt or existing-service deployment change. Final delivery facts are recorded in the linked Dev PR/task archive.
|
||||||
@@ -0,0 +1,243 @@
|
|||||||
|
---
|
||||||
|
title: RDM 设置归属、成员、文档职责与权限矩阵完善增量方案
|
||||||
|
date: 2026-10-13
|
||||||
|
type: feature
|
||||||
|
execution: code
|
||||||
|
artifact_contract: rdm-increment-plan/v1
|
||||||
|
product_contract_source: legacy-requirements
|
||||||
|
---
|
||||||
|
|
||||||
|
# RDM 设置归属、成员、文档职责与权限矩阵完善增量方案 r1
|
||||||
|
|
||||||
|
负责人:weichen;编制:ZCode;核对日期:2026-10-13(北京时间)。
|
||||||
|
上游方案:[2026-10-12 RDM 功能、实现与计划矩阵及整改方案](2026-10-12-rdm-function-implementation-plan.md)(下称"总案"),本增量承接其本稿 U3、U4、U6,涉及职责一致性的部分衔接 U5。
|
||||||
|
|
||||||
|
评审状态:2026-10-13 用户评审通过(同意方案及技术评审意见),并授权按本方案实施(P1–P8 两批推进;正式验收与清理回收节点保留人工确认)。技术评审对源码声明的逐项核查结论见文末「评审核查记录」。
|
||||||
|
|
||||||
|
## Goal Capsule
|
||||||
|
|
||||||
|
以现有 RDM 实施总案的一个完整增量,先厘清设置归属和服务端权限,再补齐搜索、选择、职责分配与权限矩阵交互,保证界面显示、保存结果和实际执行一致。终点:创建者、普通成员、职责人员在真实账号浏览器流程中完成成员添加、职责分配、权限查看与设置保存,且服务端边界(受管设置、成员校验、原子职责变更、权限范围)全部经真实请求验证。
|
||||||
|
|
||||||
|
非目标:不扩展飞书集成、组织架构、多角色叠加或全量文档生成工程。
|
||||||
|
|
||||||
|
## 一、当前实现与需要补齐的内容
|
||||||
|
|
||||||
|
| 方面 | 当前源码情况 | 本次需要完成 |
|
||||||
|
|---|---|---|
|
||||||
|
| 设置归属 | 项目设置展示完整 schema;用户、项目设置都能覆盖模型等配置 | 设置作用域、管理员系统设置入口、写入与最终生效值双重约束 |
|
||||||
|
| 成员管理 | 手填账号;已有分页账号目录,但只有账号和有效态 | 账号/姓名搜索、提示选择、下拉浏览、专业角色过滤、明确的项目身份修改 |
|
||||||
|
| 文档职责 | 手填文档 ID 和人员账号;主要读取提交快照 | 文档搜索/列表/树选择、当前职责回填、项目成员选择、提交校验 |
|
||||||
|
| 权限查看 | 已有单成员权限解释表 | 单成员详情与多人矩阵、中文标签、项目动作范围、上限内配置 |
|
||||||
|
| 一致性 | 存在职责目标未校验成员、职责更新与审签失效分步执行等缺口 | 服务端统一校验、原子变更、版本冲突、撤权及历史保全 |
|
||||||
|
|
||||||
|
对应实现锚点:Frontend `src/components/ProjectSettingsModal.tsx`、`src/components/adminRdmSections.tsx`;Backend `internal/settings/settings.go`(覆盖链 `defaults → system → user → project`);RDM `plugins/rdm/plugin.go`、`internal/perms/perms.go`、`internal/rdmapp/docsubmission.go`。
|
||||||
|
|
||||||
|
## 二、设置归属与界面结构
|
||||||
|
|
||||||
|
沿用现有设置入口和 `SettingsShell`,项目设置收敛为四个页面:
|
||||||
|
|
||||||
|
| 页面 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| 项目设置 | 真正属于本项目的共享配置与协作规则 |
|
||||||
|
| 项目成员 | 成员搜索、添加、项目身份调整、移除 |
|
||||||
|
| 文档职责 | 文档查找、职责查看与分配、相关审签状态 |
|
||||||
|
| 项目权限 | 单成员权限详情、成员权限矩阵、允许范围内的配置 |
|
||||||
|
|
||||||
|
系统管理中补齐“模型与服务配置”,承接主模型、轻量模型、Embedding、Rerank、模型密钥与 Tavily 等系统配置;Agent 工具限制、系统插件、全局专业角色和权限上限也归系统管理。个人设置只保留个人偏好。
|
||||||
|
|
||||||
|
实施时需要处理三个层面:
|
||||||
|
|
||||||
|
- **展示范围**:设置描述携带允许作用域、管理资格、生效时机;项目页面只消费项目项。
|
||||||
|
- **写入范围**:用户/项目 API 拒绝写入系统受管项,包括嵌套字段和点路径形式,插件设置也遵守同一规则。
|
||||||
|
- **实际生效**:旧用户/项目覆盖值不能继续影响系统模型;个人画像的模型路由及个人模型密钥也必须纳入受管校验,堵住其他覆盖入口。
|
||||||
|
|
||||||
|
另外,当前“项目设置”实际上按“用户+项目”保存(Backend `Effective(owner, projectID)`,project scope 物理存储在各 owner 名下)。需要区分:
|
||||||
|
|
||||||
|
- **共享项目业务配置**:以项目为权威,同一项目不同成员读取一致。
|
||||||
|
- **个人在该项目中的偏好**:继续属于个人。
|
||||||
|
|
||||||
|
跨会话读取必须保留本人会话的隐私边界,不能因项目配置共享而开放其他成员的私聊、上传原件或个人草稿。
|
||||||
|
|
||||||
|
## 三、成员管理交互
|
||||||
|
|
||||||
|
采用**一个可搜索的人员选择器**,同时支持输入、提示选择和下拉浏览,不为每种途径增加独立页面。
|
||||||
|
|
||||||
|
添加流程:打开人员选择器 → 输入账号或姓名,或浏览候选 → 可按专业角色过滤 → 选择人员 → 设置项目身份 → 添加。
|
||||||
|
|
||||||
|
具体行为:
|
||||||
|
|
||||||
|
- 输入账号支持精确匹配;姓名、账号支持模糊检索。
|
||||||
|
- 未输入时显示分页候选;选择器内提供“全部专业角色/系统工程师/软件工程师……”筛选。
|
||||||
|
- 候选显示“姓名、账号、专业角色”;同名人员通过账号区分,姓名为空时使用账号。
|
||||||
|
- 已加入人员标记“已加入”,避免重复添加造成隐式身份变更。
|
||||||
|
- 最终提交稳定账号标识,不能直接提交搜索文字。
|
||||||
|
- 成员表分别展示“专业角色”和“项目身份”,不混用两者。
|
||||||
|
|
||||||
|
项目身份使用“项目负责人/项目成员”等中文名称。成员行提供明确的“调整项目身份”和“移除”操作;继续保护最后一位负责人。
|
||||||
|
|
||||||
|
服务端复用已有 `rdm.account.list`,补齐受限的姓名搜索、精确账号校验和专业角色摘要。**不能直接把管理员用户列表或包含全部账号绑定的角色管理接口开放给项目负责人。**
|
||||||
|
|
||||||
|
角色筛选只帮助找到人员;项目负责人不能借此修改账号的全局专业角色。账号有效状态必须来自基座实际能力,不能把当前简单的 `valid=true` 当作完整的账号停用机制。
|
||||||
|
|
||||||
|
## 四、文档查找与职责分配
|
||||||
|
|
||||||
|
文档职责页面采用“**文档清单+选中文档的职责详情**”:
|
||||||
|
|
||||||
|
- 上方提供统一搜索框,支持文档 ID 精确检索、标题精确/模糊匹配。
|
||||||
|
- 支持文档列表与树形浏览;阶段、文档类型、未分配/已分配、审签状态可用于筛选。
|
||||||
|
- 树形视图忠实呈现当前文档结构,只有文档节点可以作为职责分配对象,章节不能误作 `docId`。
|
||||||
|
- 搜索、列表和树选择共用同一目录与选中状态。
|
||||||
|
- 结果显示名称、阶段/类型、职责概况和状态;ID 保留为辅助定位信息。
|
||||||
|
|
||||||
|
已有文档树查询属于审计面,不能降低它的授权规则来供选择器使用。应补齐专用的职责管理元数据读面:
|
||||||
|
|
||||||
|
- 有职责分配权的管理者可以读取必要的管理元数据。
|
||||||
|
- 普通成员只获得其有权查看的文档范围。
|
||||||
|
- 标题、数量、筛选结果和树节点均在服务端过滤,避免通过搜索泄露不可见资源。
|
||||||
|
|
||||||
|
选中文档后,立即读取并回填**当前职责**,包括尚未提交过审签的文档。当前职责与“某轮提交冻结的职责名单”分别展示,不能混为一份数据。
|
||||||
|
|
||||||
|
人员选择规则:
|
||||||
|
|
||||||
|
| 职责 | 选择方式 | 约束 |
|
||||||
|
|---|---|---|
|
||||||
|
| 编制人 | 搜索、下拉、专业角色过滤 | 单选 |
|
||||||
|
| 审核人 | 搜索、下拉、专业角色过滤 | 多选,至少一人 |
|
||||||
|
| 批准人 | 搜索、下拉、专业角色过滤 | 单选 |
|
||||||
|
|
||||||
|
**所有候选只能来自当前项目成员。**保存时服务端再次校验账号、项目成员关系、对象归属、操作资格和职责版本;文档级(`rdm.review.assign.doc`)、章节级(`rdm.review.assign`)及旧命令入口均遵守同一规则。
|
||||||
|
|
||||||
|
保留编制、审核、批准互异的规则。专业角色筛选不自动授予文档职责;管理权也不自动获得代编、代审或代批资格。
|
||||||
|
|
||||||
|
职责变更需要补齐以下行为:
|
||||||
|
|
||||||
|
- 在途审签受影响时,先显示受影响轮次与“需要重新提交”的提示。
|
||||||
|
- 明确确认后,职责更新、在途审签失效和事件记录原子完成。
|
||||||
|
- 保留旧冻结名单、审核记录和已批准历史,不把旧票带入新轮次。
|
||||||
|
- 无变化保存保持幂等;并发修改返回明确冲突。
|
||||||
|
- 移除仍承担当前职责的成员前,展示受影响文档并引导处理,防止留下无人可执行的职责。
|
||||||
|
|
||||||
|
总案要求的批量分配放在同一文档清单中:勾选文档、预览统一职责方案、确认提交。首版采用有界批次,任一文档校验失败则整批不写入,并列出原因。
|
||||||
|
|
||||||
|
## 五、单成员权限与多人矩阵
|
||||||
|
|
||||||
|
“项目权限”提供两个视图,共享同一服务端权限解释:
|
||||||
|
|
||||||
|
| 视图 | 默认行为 | 用途 |
|
||||||
|
|---|---|---|
|
||||||
|
| 按成员查看 | 普通成员查看自己;管理者可搜索其他成员 | 查看具体权限、配置来源和拒绝原因 |
|
||||||
|
| 权限矩阵 | 管理者查看成员×项目动作 | 比较成员权限,发现缺失或差异 |
|
||||||
|
|
||||||
|
矩阵支持成员搜索、专业角色/项目身份过滤、分页及权限分组。点击单元格可展开解释,显示角色默认、管理员上限、项目覆盖及结果。
|
||||||
|
|
||||||
|
项目覆盖使用三态:沿用角色默认/项目内允许/项目内禁止。管理员上限禁止的动作不能通过项目覆盖授予;“恢复默认”需要实际撤销覆盖,不能用一个布尔值模拟。
|
||||||
|
|
||||||
|
权限目录必须明确动作所属范围:
|
||||||
|
|
||||||
|
| 内部标识 | 显示名称 | 所属范围 |
|
||||||
|
|---|---|---|
|
||||||
|
| `project.create` | 创建项目 | 系统角色权限,项目页面不出现 |
|
||||||
|
| `member.manage` | 管理项目成员 | 项目 |
|
||||||
|
| `duty.assign` | 分配文档职责 | 项目 |
|
||||||
|
| `stage.advance` | 推进项目阶段 | 项目 |
|
||||||
|
| `doc.read` | 读取文档 | 项目动作,具体文档仍须授权 |
|
||||||
|
| `doc.write` | 编制与编辑文档 | 项目动作,仍受职责和状态限制 |
|
||||||
|
| `knowledge.publish` | 发布项目知识 | 项目 |
|
||||||
|
|
||||||
|
这个范围划分同时约束矩阵读面和覆盖写面:**不能只是隐藏 `project.create`,服务端也必须拒绝在项目中配置它。**
|
||||||
|
|
||||||
|
权限名称、项目身份、来源、状态及拒绝原因统一使用人类可读文案。内部标识只保留在按需展开的技术详情中。
|
||||||
|
|
||||||
|
同时核对每项权限与真实操作门禁。例如当前项目归档还有创建者/域管理员条件,矩阵解释必须反映真实条件。矩阵中的“允许编制文档”也不能意味着能修改项目内所有文档。
|
||||||
|
|
||||||
|
普通成员自查权限的条件收敛为“当前有效项目成员”,避免文档读取权限被收回后,连自身权限与原因也无法查看。
|
||||||
|
|
||||||
|
## 六、技术划分与实施工作包
|
||||||
|
|
||||||
|
基座负责身份、基本资料、受管设置机制与通用契约;RDM 负责项目成员、专业角色、权限策略及文档职责;Frontend 负责业务交互;UI 仓提供通用选择器原语。
|
||||||
|
|
||||||
|
| 工作包 | 内容与主要范围 | 依赖 | 完成条件 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| P1 契约与需求固定 | 设置作用域、项目动作目录、人员/文档候选 DTO、能力与版本语义;更新关联方案 | 无 | 本次五项要求都有稳定验收条件,四类身份/角色/职责概念明确 |
|
||||||
|
| P2 系统设置闭环 | Core 设置描述、Backend 设置 API/存储/生效链/模型及密钥解析;系统管理入口 | P1;**基座发版与 RDM/Dev 升 pins**(见评审补充 1) | 系统受管项只能由有权管理员配置,旧个人/项目值不能覆盖 |
|
||||||
|
| P3 人员与成员接口 | 扩展公开账号搜索;RDM 专业角色摘要、成员查询、项目身份调整与提交校验 | P1;姓名来源核实(见评审补充 3) | 账号/姓名/角色过滤同源,添加与身份调整明确分离 |
|
||||||
|
| P4 文档与职责接口 | 专用文档目录、当前职责读取、统一职责服务、版本校验、变更失效及成员移除联动 | P1、P3 | 跨项目/非成员指派被拒,职责与审签变更全成或全败 |
|
||||||
|
| P5 通用选择器 | UI 仓搜索选择、单/多选、键盘操作、分页与状态;Frontend 人员/文档适配 | P1,接线依赖 P3、P4 | 三类使用场景共享交互,无自由文本误提交 |
|
||||||
|
| P6 权限解释与矩阵 | RDM 项目动作目录、单人/批量解释、覆盖三态、来源与拒绝原因 | P1、P3 | 矩阵与执行规则一致,系统动作无法写入项目覆盖 |
|
||||||
|
| P7 项目设置集成 | 重构现有项目页,连接四个页面、能力状态、读取回填与保存结果 | P2—P6 | 创建者、普通成员、职责人员均有对应可用流程 |
|
||||||
|
| P8 迁移与组合验收 | 旧配置处置、真实数据库与浏览器验收、精确组件组合验证、证据回填 | P2—P7 | 需求到证据闭合,无越权、隐私泄露或数据丢失 |
|
||||||
|
|
||||||
|
前端主要改动落在现有 `ProjectSettingsModal`、`adminRdmSections`、`rdmManagement`、`api` 和 `store`;按业务拆分成员、职责及权限组件,避免继续扩大一个管理组件文件。
|
||||||
|
|
||||||
|
目前 Dev 与 RDM 固定的 Backend 版本存在能力差异。实施时必须按公开契约推进相关版本,再完成组合验证,不能因为独立 RDM 仓已有某个接口就假定 Dev 组合可直接使用。
|
||||||
|
|
||||||
|
## 七、界面与异步状态要求
|
||||||
|
|
||||||
|
按根目录 `DESIGN.md` 实施,复用现有令牌、动效、设置外壳和折叠原语。
|
||||||
|
|
||||||
|
- 一种对象只有一个主要选择路径,搜索和浏览在同一选择器完成。
|
||||||
|
- 姓名、文档名为主要信息,账号和 ID 为辅助信息。
|
||||||
|
- 下拉支持键盘移动、确认、关闭;审核人多选使用清晰标签。
|
||||||
|
- 加载、空结果、权限不足、接口未装配、查询失败分别呈现。
|
||||||
|
- 切项目、切文档、改筛选时清除不适用的选中项和结果;迟到响应不能覆盖当前对象。
|
||||||
|
- 异步状态只有一个所有者,按请求代次/事件顺序丢弃过期结果。
|
||||||
|
- 保存后读取服务端结果;网络断开且结果未知时先核对状态,避免盲目重放。
|
||||||
|
- 未保存改动提供轻量离开提示;需重启的设置明确显示待生效,不能统一宣称即时生效。
|
||||||
|
- 窄屏按成员查看权限,矩阵可横向浏览,不压缩成不可读的小格子。
|
||||||
|
|
||||||
|
## 八、迁移、验证与交付安排
|
||||||
|
|
||||||
|
旧配置先做脱敏盘点,列出配置路径、来源和冲突状态。不能任取某个用户/项目的模型配置提升为全系统配置。先确定并验证系统配置,再启用受管策略;旧值保留受保护的恢复依据,退出生效链。
|
||||||
|
|
||||||
|
旧项目内 `project.create` 覆盖退出项目策略,保留历史依据。历史职责、审核与批准记录保留;无效的当前职责列入修复清单,不自动替换人员。
|
||||||
|
|
||||||
|
正式验收至少覆盖:
|
||||||
|
|
||||||
|
| 验收场景 | 预期结果 |
|
||||||
|
|---|---|
|
||||||
|
| 项目与个人设置写入系统模型项,包括手造请求 | 拒绝;旧覆盖也不影响运行结果 |
|
||||||
|
| 账号、姓名、下拉、专业角色过滤查找成员 | 能找到并选择稳定账号;同名不会误选 |
|
||||||
|
| 重复添加已有负责人、并发修改最后负责人 | 不发生隐式降级,不破坏负责人约束 |
|
||||||
|
| 文档 ID、标题、列表、树查找 | 指向同一文档;章节及其他项目对象不能误提交 |
|
||||||
|
| 搜索后人员被移出项目,再保存职责 | 服务端拒绝 |
|
||||||
|
| 职责变更中途失败 | 职责、审签状态与事件完整回滚 |
|
||||||
|
| 单成员详情与多人矩阵对照实际操作 | 结果与原因一致;具体资源限制清晰 |
|
||||||
|
| 项目覆盖授予超上限动作或 `project.create` | 拒绝;恢复默认真正生效 |
|
||||||
|
| 快速切项目/文档、断网、迟到响应 | 不显示旧对象数据,不误报成功 |
|
||||||
|
| 同项目多成员使用、刷新及重启 | 共享配置一致,个人会话与原件仍私有 |
|
||||||
|
|
||||||
|
验证分为领域与契约测试、真实 SQLite/PostgreSQL 集成、真实身份浏览器流程,以及 Dev 精确组合的 `make test`、`make build`。浏览器需要覆盖非管理员项目负责人、普通成员、互异的编制/审核/批准人员及两个项目;不能用全管理员账号代替权限验收。
|
||||||
|
|
||||||
|
分两批形成可审查实现:先完成 P1—P4、P6 的服务端边界与契约,再完成 P5、P7 和 P8 的交互及组合验收。界面设计可在第一批同时评审。
|
||||||
|
|
||||||
|
## 评审补充(2026-10-13 技术评审并入,随方案一并批准)
|
||||||
|
|
||||||
|
1. **P2 显式依赖基座发版。** 受管设置机制是基座(Backend/Core)公开契约扩展,按总案交付顺序走“扩展申请评审→基座实现→基座发版→RDM/Dev 升 pins→组合验证”。P2 完成条件在原基础上追加:基座版本已发、pins 已升、Dev 组合 `make test` 通过。
|
||||||
|
2. **项目共享配置的存储迁移规则。** 当前 project scope 物理存储在各 owner 名下;改为“以项目为权威”需要:新项目作用域存储、存量多 owner 副本的合并策略(默认规则:同键取最近写入时间,冲突清单列出不自动合并的键并交项目负责人裁定)、旧键退出生效链并保留只读恢复依据。P8 交付物含迁移清单与执行记录。
|
||||||
|
3. **姓名来源与账号停用能力须先过 facts。** 基座账号目录当前明确“不含姓名/联系方式”。P3 的姓名搜索依赖基座账号模型是否存有姓名/显示名字段;P1 契约先定姓名来源(基座扩契约,或 RDM 专业角色档案补姓名)。账号停用机制现状同样按 `policy/facts.md` 登记验证,未证实前不把 `valid=true` 当作停用语义。
|
||||||
|
|
||||||
|
## 顺序裁定(2026-10-13)
|
||||||
|
|
||||||
|
本增量按自身 P1→P8 顺序推进;P2 的基座契约扩展按总案 369 行发版顺序执行,与总案 U1/U9 残余项的交织在扩展申请评审时统一排队,不因本增量跳过 U1(正式产物)与 U9(公开授权契约)的既有优先级。
|
||||||
|
|
||||||
|
## 评审核查记录(2026-10-13,源码 3fb8210 / RDM 255f9cb)
|
||||||
|
|
||||||
|
评审对方案“当前源码情况”逐项核查,全部属实:
|
||||||
|
|
||||||
|
| 声明 | 证据 |
|
||||||
|
|---|---|
|
||||||
|
| 项目设置按“用户+项目”保存 | Backend `settings.go` `Effective(owner, projectID)`,project scope 以 owner 为键 |
|
||||||
|
| user/project 覆盖可改模型设置,无受管拦截 | 同上覆盖链,无“系统受管”概念 |
|
||||||
|
| 成员手填账号 | `adminRdmSections.tsx` RdmMembersSection |
|
||||||
|
| 账号目录仅 owner+有效态 | RDM `rdm.account.list` 描述“owner+有效态;不含姓名/联系方式” |
|
||||||
|
| 职责手填 docId 与账号 | RdmDutiesSection placeholder |
|
||||||
|
| 已有单成员权限解释表 | `rdm.perm.check`(动作/生效/来源/原因),前端默认自省 |
|
||||||
|
| 权限标识与所属范围 | RDM `internal/perms/perms.go:21-31`,`project.create` 注释即“全局动作” |
|
||||||
|
| 职责目标未校验成员 | `rdmReviewAssign` handler 注释“数据,非身份”——按 G1-5 旧裁定绕过成员校验;**本方案 P4 推翻该裁定,属规则变更,在 P1 契约中记录** |
|
||||||
|
| 职责更新与审签失效分步 | 文档级 assign 先写职责再调 `InvalidateActiveDocSubmission`,两步顺序非原子;**章节级 assign 完全未接失效** |
|
||||||
|
|
||||||
|
## 主记录与推进
|
||||||
|
|
||||||
|
- 主记录:本文件(唯一正文);任务卡 `.task/feature-rdm-increment-settings-duties.md` 承载需求表、证据与阶段结论。
|
||||||
|
- 来源:`.tmp/Discussion-Meetings/2026-10-08_12-24/.tmp/user-supplement.txt`(原始用户补充)、2026-10-13 会话评审。
|
||||||
|
- 下一步:P1 已随本稿固定;按两批顺序进入 P2(基座受管设置契约扩展申请)与 P3/P4/P6 服务端实现。
|
||||||
@@ -170,6 +170,10 @@ RDM 总案把库分期作为支撑与依赖,不覆盖库分期的原始范围
|
|||||||
后续维护:主案或任务变化时先更新其唯一主记录,再更新这里的导航和核验快照。
|
后续维护:主案或任务变化时先更新其唯一主记录,再更新这里的导航和核验快照。
|
||||||
更换 Docs/Dev 基线后重新核对 PR、版本与在途任务;新的索引状态不自动产生实施授权。
|
更换 Docs/Dev 基线后重新核对 PR、版本与在途任务;新的索引状态不自动产生实施授权。
|
||||||
|
|
||||||
|
## 2026-10-13 规划补充
|
||||||
|
|
||||||
|
- [RDM 设置归属、成员、文档职责与权限矩阵完善增量方案 r1](2026-10-13-rdm-settings-members-duties-perms-increment.md):承接总案 U3/U4/U6(衔接 U5)的完整增量——设置作用域与受管项、可搜索人员选择器、文档清单+职责分配、单成员/多人权限矩阵与三态项目覆盖;含服务端一致性修复(职责目标成员校验推翻 G1-5 旧裁定、职责变更与审签失效原子化)与 P1–P8 工作包。**2026-10-13 用户评审通过并授权实施**(两批推进;正式验收与清理回收保留人工节点);P1 契约随本稿固定,P2 基座契约扩展按总案发版顺序排队。
|
||||||
|
|
||||||
## 2026-10-12 规划补充
|
## 2026-10-12 规划补充
|
||||||
|
|
||||||
- [svc 统一部署与一次性登录 Key 方案 r1](2026-10-12-svc-unified-deploy-and-login-key.md):将 `svc.sh` 增强为二进制/源码统一部署入口,并补齐无初始密码开户与账户恢复;一次性登录 Key 只能兑换设密受限会话。r1 含源码复核与四项取舍定案;复用恢复方案 KTD 与已合入的 recovery U1(Dev #415)。**2026-10-12 已批准**(五阶段+U1/U4 规格);授权推送/PR 与 U1/U4 实施启动;合入由 owner 执行。规格见 Dev `docs/svc-deploy/`。
|
- [svc 统一部署与一次性登录 Key 方案 r1](2026-10-12-svc-unified-deploy-and-login-key.md):将 `svc.sh` 增强为二进制/源码统一部署入口,并补齐无初始密码开户与账户恢复;一次性登录 Key 只能兑换设密受限会话。r1 含源码复核与四项取舍定案;复用恢复方案 KTD 与已合入的 recovery U1(Dev #415)。**2026-10-12 已批准**(五阶段+U1/U4 规格);授权推送/PR 与 U1/U4 实施启动;合入由 owner 执行。规格见 Dev `docs/svc-deploy/`。
|
||||||
@@ -183,3 +187,5 @@ RDM 总案把库分期作为支撑与依赖,不覆盖库分期的原始范围
|
|||||||
- [RDM 模板与两树一网对话文档生成方案 r1.1](2026-10-11-rdm-template-dialog-generation.md):69 类旧资产、4 个当前注册模板的盘点及生成闭环设计;待评审,实施/迁移/模型试验/运行验收 NOT_RUN。与两树一网集成方案共用项目授权、原子事件与历史能力。 首批项目建议书/竞品分析、随后扩展全部文档已确认(2026-10-11),其余方案与实施仍待评审。
|
- [RDM 模板与两树一网对话文档生成方案 r1.1](2026-10-11-rdm-template-dialog-generation.md):69 类旧资产、4 个当前注册模板的盘点及生成闭环设计;待评审,实施/迁移/模型试验/运行验收 NOT_RUN。与两树一网集成方案共用项目授权、原子事件与历史能力。 首批项目建议书/竞品分析、随后扩展全部文档已确认(2026-10-11),其余方案与实施仍待评审。
|
||||||
|
|
||||||
- [RDM 最终目标核对与完整交付方案 r1](2026-10-11-rdm-final-target-completion.md):本轮用户确认系统级唯一项目、管理员上限内覆盖、私域与三权读取边界;覆盖 34 UR/68 SR/10 F、全部69类模板及现有XLSX,当前源复核 RDM d8d7e743。总体方案待评审,实施/迁移/运行验收 NOT_RUN;模板方案为子方案。
|
- [RDM 最终目标核对与完整交付方案 r1](2026-10-11-rdm-final-target-completion.md):本轮用户确认系统级唯一项目、管理员上限内覆盖、私域与三权读取边界;覆盖 34 UR/68 SR/10 F、全部69类模板及现有XLSX,当前源复核 RDM d8d7e743。总体方案待评审,实施/迁移/运行验收 NOT_RUN;模板方案为子方案。
|
||||||
|
|
||||||
|
- [工作台界面重设计 r0.2](2026-10-12-work-companion-ui-design.md)及[实施计划 r1](2026-10-12-work-companion-ui-plan.md):对话优先、渐进任务摘要、窄屏与单一状态投影;已获本次连续实施授权。
|
||||||
|
|||||||
@@ -74,12 +74,27 @@ K4 的原因在源应用日志:未设置 `BLOBSTORE_S3_ENDPOINT` 时,`NewS3F
|
|||||||
|
|
||||||
同日另一次恢复(`backup-20261012-150713`)在数据目录复制之后起不来,因为 socket 路径超过 107 字节。正式这次把 socket 放到 `/tmp/u7bk-18997`。
|
同日另一次恢复(`backup-20261012-150713`)在数据目录复制之后起不来,因为 socket 路径超过 107 字节。正式这次把 socket 放到 `/tmp/u7bk-18997`。
|
||||||
|
|
||||||
## 5. 放行
|
## 5. 放行(2026-10-12 当时)
|
||||||
|
|
||||||
B6、C4 为 SELF 通过。C5 的库恢复为 SELF 通过,工件恢复失败。第二实例写流量仍不放行。
|
B6、C4 为 SELF 通过。C5 的库恢复为 SELF 通过,工件恢复失败。第二实例写流量仍不放行。
|
||||||
|
|
||||||
还没做、本任务不启动的两项:
|
当时还没做、该任务不启动的三项:
|
||||||
|
|
||||||
- 独立 REPLAY,或把 C4/C5 的快速档接进 CI 成为 GATE(需要平台准入)。
|
- 独立 REPLAY,或把 C4/C5 的快速档接进 CI 成为 GATE(需要平台准入)。
|
||||||
- C3 双主机。
|
- C3 双主机。
|
||||||
- 上传在未配置对象存储时 panic,需要单独的产品修复后才能重测 K4。
|
- 上传在未配置对象存储时 panic,需要单独的产品修复后才能重测 K4。
|
||||||
|
|
||||||
|
## 6. 2026-10-13 K4 重测
|
||||||
|
|
||||||
|
上传 panic 已在 store 边界修复:带类型的空对象存储(未设置 `BLOBSTORE_S3_ENDPOINT` 时的 `(*S3)(nil)`)视为未配置,回落本地工件目录。已构造的对象存储保持不变。Backend 提交 `46073d30`,Dev 被测头 `a83588dd`,backend gitlink 同为 `46073d30`。
|
||||||
|
|
||||||
|
重跑入口仍是 `tests/ops/run_backup_drill.sh`。结果目录 `tests/ops/results/backup-20261013-013354`(SELF)。原始结果另存于仓外 `/home/weichen/projects/u7-k4-retest-preserved-20261013`。
|
||||||
|
|
||||||
|
| 判据 | 结果 |
|
||||||
|
|---|---|
|
||||||
|
| K1–K3、K5–K7 | 过。RPO 65 秒,RTO 3 秒。`pg_verifybackup` 与 `pg_restore --list` 退出码 0,逻辑恢复约 5 秒,恢复后计数与故障前一致 |
|
||||||
|
| K4 工件与权限 | **过**。5 个工件 `checked=5`、`missing=0`、`mismatch=0`。跨用户访问项目和工件均为 404 |
|
||||||
|
|
||||||
|
`content_path` 仍是绝对路径,快照继续还原到原目录。静态加密、凭据演练和整盘损坏仍是 N/A。
|
||||||
|
|
||||||
|
第二实例写流量仍不放行。剩下的门槛是独立 REPLAY 或经平台准入后的 C4/C5 CI 快速档,以及 C3 双主机。
|
||||||
|
|||||||
Reference in New Issue
Block a user