Why: Record the approved design for isolated no-project conversations.
Evidence: Design sections 1-4 approved 2026-10-22; task-start R0=a4311c63.
Impact: Docs only under docs/superpowers/{specs,plans}.
Refs: docs/superpowers/specs/2026-10-22-scratch-session-general-agent-design.md
Co-authored-by: Cursor <cursoragent@cursor.com>
5.1 KiB
5.1 KiB
无项目对话(Scratch Session)设计
- 状态:已批准(对话设计第 1–4 节,2026-10-22)。
- 日期:2026-10-22;作者:host(设计整理);来源等级:SELF。
- 配套计划:实施计划。
1. 目标与非目标
目标
- 任意启用账号可创建「无项目对话」,当作通用智能体使用(多轮对话)。
- 无
project.create(角色「项目访问」)的用户也能完成该路径,不被「默认项目」创建 403 卡住。 - 各无项目对话彼此独立:不共享文档、上下文、知识等。
- 不得接入知识树、文档树、成员、RDM 等项目专属功能。
非目标(本轮)
- scratch → 真项目升级 / 事后绑定 RDM
- 分享、协作、邀请进空壳项目
- 配额、TTL、自动清理
- 将
conversations.project_id改为可空等大 schema 重构
2. 已锁定决策
| 项 | 决策 |
|---|---|
| 数据模型 | 方案 A:每个无项目对话 = 一个轻量私有空壳 Project + 恰好一条 Conversation |
| UI | 侧栏虚拟分类「无项目对话」下列会话;不进入真项目切换器 |
| 谁可建 | 所有启用账号(有无 project.create 均可) |
| 权限 | 固有能力,不进角色矩阵,不可被管理员修改;与可配置的 project.create 完全分离 |
3. 数据模型与权限
3.1 空壳项目约定
- 仍用现有
projects表;settings写入稳定标记:host.kind = "scratch"(解析仅经统一 helper,例如IsScratchProject)。 - 每个无项目对话 = 一个 scratch 项目 + 恰好一条会话(创建时原子写入;禁止在 scratch 下再建第二会话)。
- 项目
owner= 当前账号;不建成员、不共享、不邀请。 - 会话默认
crossPrivate = true。
3.2 权限
| 动作 | 门禁 |
|---|---|
POST /api/projects 创建真项目 |
仍要 project.create(不变) |
| 创建无项目对话 | 启用账号即可;不是角色可配置动作 |
| scratch 上读写会话/发消息 | 仅 owner |
| scratch 升成真项目 / 绑 RDM | 本轮不做(明确拒绝) |
角色 catalog、PUT .../permissions、角色编辑 UI 不得出现或改写「无项目对话」能力。关掉 project.create 不影响 scratch 创建。
3.3 专用创建 API
POST /api/scratch-sessions → { project, conversation }
- 内部:插 scratch 项目 → 建唯一会话 → 不触发 RDM provision。
- 禁止经
POST /api/projects伪造 scratch 标记。
3.4 列表语义
- 真项目列表 / 侧栏项目切换器:过滤掉 scratch。
- 「无项目对话」分类:按会话列出(标题来自会话名)。
4. 服务端门禁(禁用项目专属能力)
判定:IsScratchProject(p) ≡ settings.host.kind == "scratch"。
一律拒绝(scratch 上)
- RDM 绑定 / provision;
rdm.*命令对 scratch 的 projectId → 403/400 - 知识树 / 文档树 / 法规树 / 驾驶舱 / 模板实例化
- 成员、职责、项目权限矩阵、项目归档协作
- 因「拥有 scratch」而授予
project.create联动能力 - Project Context(X1)注入(视为未启用,走普通通用智能体组装)
- 跨会话读:scratch 会话不可被对端读出,也不可读其他会话
- 在已有 scratch 下再建会话
- 普通创建项目接口伪装 scratch
允许(通用智能体最小集)
- 本会话消息、附件(仅挂本 scratch,不进知识发布)
- 会话改名 / 置顶 / 归档 / 删除(删除可级联删空壳项目)
- 普通 LLM 对话;显式
@knowledge对 scratch 关闭
实现:集中 rejectIfScratch / requireNonScratch,挂在项目工作、RDM 分发、knowledge、成员 API;不能只藏 UI。
5. 前端信息架构
- 项目切换器:真项目列表 + 虚拟项「无项目对话」。
- 选中「无项目对话」:列出本人所有 scratch 会话;「+ 新建对话」调用 scratch API。
- 打开 scratch 会话时:隐藏项目设置、模板生成、依赖当前真项目的 RDM 入口。
createTask:无真项目时不再自动createProject('默认项目');无建项权或用户在无项目对话视图时走 scratch API。- 无建项权用户主路径:登录 → 默认落在「无项目对话」→ 可直接新建/继续对话。
6. 验收标准
- 无建项权账号可进入「无项目对话」并完成多轮通用对话,不因默认项目 403。
- 有建项权账号同样可建无项目对话;真项目创建仍只认
project.create。 - 同一用户两个 scratch 会话互不共享附件知识库、上下文条目、跨会话读取。
- scratch 上 RDM/知识树/文档树/成员/项目设置类能力服务端拒绝;UI 无入口。
- 角色权限 UI / API 不能出现或改写该能力。
- scratch 不出现在项目切换器。
- 无法在已有 scratch 项目下再建第二条会话。
7. 最小验证
- Backend:创建门禁、RDM/knowledge 拒绝、ListProjects 过滤、1:1 约束单测。
- Frontend:侧栏分组、无建项权主路径、scratch 视图隐藏项目入口的测试。