# Investibook — 开发 Backlog

> 最后更新：2026-04-14
> 粒度约 2 人天/任务。已按类别分组，每类内部按优先级排序。

---

## Milestone #1

### 线上集成与持续发布

- [x] **CI/CD Pipeline** — GitHub Actions 实现自动化测试 + 构建 + 部署，持续部署到 EKS
- [x] **K8s 部署** — 完善 `deployment/kustomize/` manifests；验证 Ingress 路由（ALB）、ConfigMap 注入 `ACP_AGENT_TYPE` / `ACP_MODEL` / `ACP_AGENT_BIN`；前端 `NEXT_PUBLIC_API_URL` 生产环境留空（使用相对路径）
- [x] **EBS 持久化卷挂载** — 配置 `data-pvc.yaml` 挂载 100G EBS 到 backend pod 的 `DATA_DIR`（`/data`）；确保 `data/db/`、`data/workspaces/` 目录在 pod 重启后保持数据

### 认证 & 用户系统

- [x] **邮件登录页面（前端）** — 新建 `app/login/page.tsx`：邮箱输入框 + 登录按钮；调用 `POST /api/auth/login {email}`；成功后将 `token` / `email` 写入 `localStorage`（`investibook_token` / `investibook_email`）；未登录时所有页面重定向到 `/login`
- [x] **Auth API（后端）** — 实现 `POST /api/auth/login`（get-or-create user，生成 Bearer token，写 `user_sessions` 表）、`GET /api/auth/me`、`POST /api/auth/logout`；`get_current_user` FastAPI dependency（Bearer token → user row）接入所有受保护路由
- [x] **前端全量迁移 fetchWithAuth** — 用 `lib/auth.ts` 的 `fetchWithAuth()` 替换所有裸 `fetch()` 调用；确保 401 → 自动清除凭证 + 跳转 `/login`；更新 `lib/workspaces.ts`、`lib/workspace.tsx`、ChatPanel、SourcesPanel 等所有发请求的地方
- [ ] **OAuth / SSO（Auth0 Google）** — 替换邮件登录为 OAuth；接入 Auth0；后端 `get_current_user` FastAPI dependency 已预留 OIDC swap 接口，换用 OIDC JWT 验证；前端 `/login` 页改为 "Sign in with Google" 按钮；移除邮件登录逻辑

### Workspace 共享 & 协作

- [x] **Workspace 只读分享** — 实现 `PUT /api/workspaces/{id}/share {is_shared: bool}`；前端 Workspace Header 添加 Share 切换开关（teal 图标）和复制链接按钮；非 owner 打开分享链接时 `ChatPanel` 输入禁用、Sources 面板隐藏 "+" 按钮、Studio 禁止删除 Artifact

### 后端持久化

- [x] **SQLite Schema + 初始化** — 在 `backend/main.py`（或抽取 `backend/db.py`）实现建表：`users`、`user_sessions`、`workspaces`、`workspace_sources`、`workspace_artifacts`、`workspace_messages`、`workspace_sessions`；app startup 时自动 `CREATE TABLE IF NOT EXISTS`
- [x] **Workspace CRUD REST API** — 实现 `GET/POST /api/workspaces`、`GET/PUT/DELETE /api/workspaces/{id}`；所有查询按 `user_id` 过滤；`require_workspace_owner()` 中间件拦截非 owner 请求返回 403；迁移现有 `setup-example` 逻辑到新 schema
- [x] **Sources & Artifacts & Messages REST API** — 实现 `GET/PUT /api/workspace/{id}/sources`、`/artifacts`、`/messages`、`/session`；使用 JSON blob 存储（`workspace_sources` 等表）；前端 `WorkspaceProvider` 从 API 加载/保存，替换所有 `localStorage` 读写
- [x] **Workspace 环境变量 API** — `GET/PUT /api/workspace/{id}/env`；每个 Workspace 的 Session 目录下有 `.env` 文件，可通过专用 API 读写；`POST /api/workspaces` 创建 Workspace 时自动生成 `.env`，避免 Agent 在配置就绪前启动导致报错

### Source 接入

- [x] **后端 Alert Sync 模块** — `backend/alert_sync.py`：`async def prepare_alert_source(alert_id, workspace_id)`；从 S3 拉取三个文件写入 `data/workspaces/{workspace-id}/`；实现 `POST /api/sources/prepare` 返回 202 + `task_id`；`GET /api/sources/prepare/{task_id}` 查询进度（`processing` / `completed` / `error`）
- [x] **前端 Alert → 同步 → Report 自动化** — `AddSourceModal` 提交后调用 `POST /api/sources/prepare`，Alert `SourceCard` 展示 spinner；轮询 `GET /api/sources/prepare/{task_id}`（2s 间隔）；成功后：更新 Source status 为 `ready`，自动添加 `cluster_meta` Source，自动创建 Report + Anomaly Artifact，刷新文件树
- [x] **Source 状态指示器 UI** — `SourceCard` 支持 `loading` / `ready` / `error` 三态；`loading` 展示 spinner + "Preparing data…"；`ready` 展示绿色 ✓；`error` 展示红色 ⚠ + 错误消息；`Source` interface 新增 `status?: 'loading' | 'ready' | 'error'` 和 `statusMessage?` 字段
- [x] **StudioPanel 动态加载 Report** — 从 `GET /api/workspace/{id}/file-content?path=insight.json` 动态加载 InsightReport 数据，替换硬编码的 `data/example-workspace/insight.json`；同样动态加载 `diagnostic_package.json` 用于 AnomaliesPanel；支持 Artifact 数据来自 API
- [x] **Alert 评论摘要** — 准备 Alert 数据源后，AI 自动生成 Alert 评论摘要并展示在工作区界面中
- [x] **Issue-ready 通知改为系统消息** — 加载 Jira Source 后的自动消息从 `role: 'assistant'`（会持久化到后端、污染 agent 对话历史）改为 `role: 'system'` 本地通知；精简为紧凑格式；评论摘要标注为自动生成；不再引导下一步操作
- [ ] **OpenCode/Agent 创建文件追踪** — ACP Agent 创建的文件（如诊断报告、分析结果）自动添加特定前缀或后缀（如 `agent_`）；Workspace 文件树支持过滤显示这些文件；Studio 面板提供专门视图展示 Agent 生成的文件，方便用户区分和管理
- [ ] 给 Alert Source 添加删除功能，并支持 Preparing 状态中删除

### MCP 集成

> **架构变更说明（2026-04）**：Clinic / O11Y 数据访问已全面迁移到 `clinic-api` skill（通过 curl 调用 Clinic REST API），不再需要独立的 MCP server。Clinic MCP 已在 `opencode.json.template` 中禁用。当前保留的 MCP 仅有：`jira`（读取 Jira Issue）、`devops`（DevOps Portal）、`resource-worker-mcp`（分析报告）。

- [x] ~~**后端 MCP 配置基础设施**~~ — 已过时。Clinic/O11Y 数据访问已通过 `clinic-api` skill 实现，无需 MCP 配置基础设施。Jira/DevOps/Resource Worker MCP 通过 `opencode.json.template` 静态配置。
- [x] ~~**O11Y / Clinic / Ops Portal MCP 接入**~~ — 已过时。O11Y 和 Clinic 已通过 `clinic-api` skill 接入（PromQL 指标、Loki 日志、Data Proxy SQL 查询）。
- [x] **Jira MCP 接入** — Jira MCP server (`aiops-mcp-demo/jira`) 已内置，提供 `jira_get_issue`、`jira_get_alert_info`、`jira_add_comment`、`jira_get_comments` 工具。
- [x] **Jira Search API v2→v3 迁移** — Atlassian 已废弃 `GET /rest/api/2/search`（返回 HTTP 410），所有 search 命令（`search-by-cluster`、`search-by-tenant`、`search-by-alert-name`）迁移到 `POST /rest/api/3/search/jql`，`fields` 改为 JSON 数组在 POST body 中传递。
- [ ] **Resource Worker MCP 接入** — 对接 Resource Worker MCP 的 `analyze_alert` 工具（生成分析报告）；将 `resource_worker_insight.json` 写入 workspace 文件系统；前端 StudioPanel 支持渲染 resource worker 生成的报告
- [x] **Grafana Screenshot MCP 接入** — 统一的 `diagnostic_screenshot` MCP 工具已实现；Agent 可截取 Grafana Dashboard 面板图片；结果以 `image` SSE 事件流式返回到聊天界面
- [x] ~~**按用户自动映射 MCP Token**~~ — 已过时。Clinic API Key 已通过 `SKILL_CLINIC_API_KEY` 环境变量在创建 Workspace 时自动注入。

### ACP Session & Chat 生命周期 & OpenCode 配置

- [x] **ACP Session 持久化与恢复** — 实现 `GET/PUT /api/workspace/{id}/session`（存 ACP `session_id` 到 `workspace_sessions` 表）；backend pod 重启后能恢复已有 session；ChatPanel mount 时从 API 加载历史 messages（当前 localStorage 逻辑迁移到 API）
- [x] **聊天记录后端持久化** — ChatPanel 每轮对话结束后调用 `PUT /api/workspace/{id}/messages` 保存到 backend；mount 时 `loadMessagesFromAPI(workspaceId)`；Agent 重新连接后用户可看到完整历史（而非重置为 WELCOME_MESSAGE）
- [x] **Workspace 生命周期管理完善** — 创建 Workspace 时后端同步初始化目录结构和 ACP session 配置；删除 Workspace 时清理后端数据（sources、artifacts、messages、session、workspace 目录文件）；更新 Workspace 名称/描述同步到后端
- [ ] **OpenCode Session 持久化** — 让 Workspace 通过 ACP 调用 OpenCode 时，状态记录是持久化的，与 Workspace 生命周期一致。参考 https://agentcommunicationprotocol.dev/core-concepts/stateful-agents。目前实现存在 bug：backend pod 重启后，用户虽能在界面看到历史记录，但 Agent 实际上没有这些 Context，而是全新的上下文。
- [ ] Clear History 时弹窗二次确认，提示会删除 OpenCode Session Context。（或留两个入口：一个只删除界面聊天记录，一个同时创建新的 OpenCode session。）

### UI/UX 优化

#### 移动端

- [x] 移动端支持

#### 通用 UI

- [x] **Logo 与应用图标** — Web UI 添加应用 Logo 和 Favicon
- [x] **Workspace 顶栏简化** — 去除顶部多余元素；简化按钮布局和字体排版，使三栏工作区视图更加简洁

### investibook-cli

> 设计文档：[docs/INVESTIBOOK_CLI.md](INVESTIBOOK_CLI.md)

investibook-cli 将 Investibook 变为可被 OpenClaw 调用的工具，同时也是值班工程师的脚本化 CLI。所有命令都是对 Web UI 所用同一套 REST + SSE API 的轻量封装——CLI 发出的 `/chat` 消息会实时出现在 Web UI 上，供团队成员同步观看。

- [x] **CLI 框架 & 认证** — 以单二进制 Go CLI 形式初始化 `investibook-cli`；实现 `investibook init --api <url> --email <email>`，将 token 存入 `~/.investibook/config.json`；支持 `INVESTIBOOK_API` / `INVESTIBOOK_TOKEN` / `INVESTIBOOK_WORKSPACE` 环境变量
- [x] **`/workspace` 命令** — `investibook workspace create/list/use/show`；将当前活跃 Workspace 持久化到 `~/.investibook/session.json`；所有命令支持 `--workspace <id>` 覆盖
- [x] **`/chat` 命令** — `investibook chat "<消息>"` 及 `--interactive` REPL 模式；通过 SSE 将 Agent 响应流式输出到终端（thinking/tool/text 用颜色区分）；Web UI 上的协作者实时看到相同消息
- [x] **`/sources` Alert 命令** — `investibook sources add alerts <alert-id>` 触发数据源准备流水线，带进度提示；支持 `list`、`remove`
- [x] **`/reports` 命令** — `investibook reports list`；`get <id|latest> [--format json|text]`；将 Studio Artifacts 渲染为结构化终端输出
- [x] **`/files` 命令** — `investibook files list`；`get <path>`
- [x] **OpenClaw 工具集成** — 将 `investibook-cli` 封装为 MCP 工具集（`investibook_create_workspace`、`investibook_add_alert`、`investibook_chat`、`investibook_get_report`、`investibook_list_files` 等）；支持 OpenClaw 自动驾驶流程
- [x] **CLI API Key 认证** — `--api-key` 参数和 `INVESTIBOOK_API_KEY` 环境变量，提供邮件登录之外的替代认证方式，适合脚本化和 CI 场景
- [x] **跨平台二进制分发** — GitHub Actions CI 为 `linux/amd64`、`linux/arm64`、`darwin/amd64`、`darwin/arm64` 构建二进制文件，每次打 Tag (`investibook/cli/v*`) 后自动发布至 S3
- [x] **CLI 自动更新** — 每次 CLI 启动时静默检查 S3 是否有更新版本（5 秒超时）；如有则原子替换本地二进制并重新执行，对用户完全透明；`INVESTIBOOK_SKIP_UPDATE=1` 可关闭；开发构建（`BuildTime="0"`）自动跳过
- [x] **一键安装脚本** — `cli/install.sh` 自动检测 OS/架构，从 S3 下载对应二进制，安装至 `~/.local/bin/investibook` 并配置 `PATH`
- [ ] （M1 未计划）**`/sources` Skill 命令** — `investibook sources add skills <url>` 从 GitHub tree URL 拉取 Skill 定义，在 Workspace 中创建 `skill` Source
- [ ] （M1 未计划）**`/files` 写入命令** — `investibook files edit <path>`（打开 `$EDITOR`，通过 `PUT /api/workspace/{id}/file-content` 写回）
- [ ] （M1 未计划）**`/bash` 命令** — `investibook bash "<命令>"`（非交互模式，依赖 Pod Terminal 功能）

### Nutshell Skills 与 Agent 知识库

- [x] **Nutshell-Skills 内置集成** — TiDB Cloud 运维团队的 `nutshell-skills` 知识库（TiDB 性能诊断文档、TiKV 调优决策树、Clinic API 指南、O11Y 指标工具、HPA 扩缩容质量评估 Skill 等）直接内置于仓库，通过各 Workspace `opencode.json` 的 `skills.paths` 在运行时加载到 OpenCode Agent
- [x] **Skills 同步基础设施** — `sync-skills.sh` 脚本 + CI 任务保持本地 nutshell-skills 与上游同步；Workspace 专属 Skill 覆盖（如 Grafana 面板查找 Skill）在保护清单中列出，不会被同步操作覆盖
- [x] **Workspace Skill 自动配置（`SKILL_CLINIC_API_KEY`）** — 后端在创建 Workspace 时自动通过 `SKILL_CLINIC_API_KEY` 环境变量将用户的 Clinic API Key 注入 `opencode.json`，调用 Clinic API 的 Skill 无需任何手动 Token 配置
- [x] **Grafana 面板查找 Skill 重构** — 从基于关键词匹配改写为目标导向模式，截图和诊断工作流的面板选择更加准确可靠
- [x] **系统提示词优化** — 对 Agent 系统提示词进行调优，减少干扰项，提升诊断专注度，改善 Session 启动时工作区上下文的处理方式
- [x] **Clinic Data Proxy API 集成** — 已通过 `clinic-api` skill 实现。`tidb-clinic-diagnosis` skill 使用 `POST /data-proxy/query` 查询 `slow_query_logs` 和 `topsql` 表，支持按 `date` 分区过滤。不再需要独立 MCP 工具。

---

## Milestone #2：诊断质量提升

> 目标：通过系统化复盘和自动化验证，持续提升诊断准确性和效率。

### TCOC 复盘 SOP

- [x] **TCOC 复盘 SOP 文档** — `docs/sops/tcoc-postmortem.md`（英文）+ `docs/sops/tcoc-postmortem.zh.md`（中文）。8 步流程：运行诊断 → 人工引导分析 → 评估 → 记录引导 → 识别缺陷 → 与 backlog 去重 → 撰写复盘 → 提交 PR。
- [x] **复盘评估模板** — `tools/replayer/cases/TEMPLATE.md`。标准化章节：Issue Summary、Actual Root Cause、Agent Diagnosis Summary、Scores（5 维度）、Human Guidance Log、Skill Deficiencies、Key Queries、Lessons Learned。每个 case 同时产出 `expected.md` 作为 replayer baseline。
- [ ] **首批 TCOC Case 复盘** — 用 SOP 复盘 5-10 个代表性 TCOC 工单，产出评估记录和 Skill 改进 PR，验证 SOP 流程可行性。进度：2/5-10 已完成（O11Y-2328599: 2.2 分，O11Y-2179140: 3.6 分）。

### Skill 缺陷 Backlog（来自复盘）

> 集中跟踪所有复盘发现的 skill 缺陷。新复盘发现相同缺陷时，在 `Reproduced in` 追加 case，不要重复创建条目。

| ID | 类型 | 优先级 | Skill | 标题 | 复现于 | 状态 |
|----|------|--------|-------|------|--------|------|
| D1 | FLOW | P0 | tidb-clinic-diagnosis | TopSQL 未设为诊断必选步骤 | O11Y-2328599, O11Y-2179140 | open |
| D2 | TEMPLATE | P0 | tidb-clinic-diagnosis | TopSQL/SlowQuery SQL 模板使用不存在的列名（`cluster_id`、`timestamp`） | O11Y-2328599, O11Y-2179140 | open |
| D3 | FLOW | P0 | tidb-clinic-diagnosis | 缺少"热点节点 → 按 instance 下钻"的决策规则 | O11Y-2328599 | open |
| D4 | TEMPLATE | P1 | tidb-clinic-diagnosis | SlowQuery 分析缺少执行计划解析（未查 `plan`/`decoded_plan`） | O11Y-2328599, O11Y-2179140 | open |
| D5 | CROSS-REF | P1 | tidb-clinic-diagnosis | 缺少多数据源交叉验证的强制要求（可从单一数据源下结论） | O11Y-2328599 | open |
| D6 | KNOWLEDGE | P1 | clinic-api | TopSQL schema 文档不完整（`timestamps`、`instance` 列未记录） | O11Y-2328599 | open |
| D7 | TEMPLATE | P2 | tidb-clinic-diagnosis | clinic-auth.sh 路径不确定，浪费工具调用搜索文件系统 | O11Y-2328599, O11Y-2179140 | open |
| D8 | REASONING | P1 | tidb-clinic-diagnosis | 单一信号过早下结论（如 ANALYZE 出现在 metrics → 错误归因） | O11Y-2328599 | open |
| D9 | REASONING | P1 | tidb-clinic-diagnosis | 执行计划分析重定性轻定量（忽略算子耗时排序） | O11Y-2328599 | open |
| D10 | FLOW | P1 | tidb-clinic-diagnosis | Node E 完成后未自动输出结构化诊断总结 | O11Y-2179140 | open |

### TCOC Auto Replayer

- [ ] **Replayer Case 库结构** — 建立 `tools/replayer/` 目录结构：`cases.yaml`（case 列表：issue_id + 诊断 prompt + 预期根因 + 评分标准）、`cases/{issue_id}/expected.md`（人工确认的正确诊断）、`results/`（每次运行输出）。
- [ ] **Replayer 核心脚本** — 实现 `tools/replayer/run-replay.sh`（或 Python），遍历 `cases.yaml` 中的 case，对每个 case 自动执行：`investibook workspace create` → `sources add jira-issues` → `chat "诊断根因"` → `reports get latest --format json` → 保存结果到 `results/`。
- [ ] **Replayer 评分器** — 实现评分逻辑（可调用 Claude Code），对比 Agent 输出 vs `expected.md`，按评分维度（根因准确性、证据完整性、因果链、效率指标如工具调用次数/耗时）生成评分报告。输出汇总表和逐 case 详情。
- [ ] **首批验证集** — 从 TCOC 复盘中挑选 5-10 个 case 写入 `cases.yaml` + `expected.md`，完成首次全量 replay 并生成 baseline 评分报告。
- [ ] **Skill 改动前后对比** — 支持 `run-replay.sh --compare <baseline>` 模式，在 Skill 改动后重跑全量 case，对比前后评分变化，输出 diff 报告（哪些 case 提升/劣化/持平）。
- [ ] （后续）**CI 集成** — 将 replayer 接入 CI：push skill 改动 → 自动触发 replay → 评分变化作为 PR check → 劣化超过阈值时阻止合并。

---

## 未来 / Backlog（暂不开发）

### 线上集成与基础设施

- [ ] **Agent Workspace 按用户 Pod 隔离** — 每个用户所有 workspace 共用一个独立 pod；重架构 ACP session 管理
- [ ] **Docker 镜像优化 + 本地 dev 一键启动** — 验证 `make install / make web / make api` 全流程；更新 `Dockerfile`（前端 + 后端）确保构建干净；docker-compose 可一条命令启动完整栈

### 认证 & 用户系统

_（无额外 Backlog 条目，M1 的 OAuth/SSO 任务已涵盖）_

### Workspace 共享 & 协作

- [ ] **Workspace 写权限分享：实时控制权移交（Control Handoff）** — 诊断过程中 owner 可将界面控制权临时移交给其他用户（如协作者远程操作）；移交期间接管方可正常发送消息、操作 Sources / Studio，owner 退回只读观察模式；Workspace 文件归属不变，所有 MCP 调用仍沿用原 owner 的凭证与权限；`PUT /api/workspaces/{id}/control {delegate_email}` 授权，`DELETE /api/workspaces/{id}/control` 收回；前端 Share 面板新增 "Hand Off Control" 入口，状态栏显示当前实际操控者；owner 可停止共享；界面显示当前控制者及观众列表。

### 后端持久化

- [ ] **Workspace 升级** — 随着功能增加，Workspace 数据结构和文件组织可能需要升级；设计版本兼容策略；实现数据迁移脚本；前端显示 Workspace 版本信息，提示用户升级。

### Source 接入

- [ ] **Alert Source Watcher** — 允许添加名为 Watcher 的 Source，持续监听某一用户新分配的 Alert，例如监听本周 Oncall 所有告警，自动添加到 Workspace
- [ ] **Git Repo Source** — 连接代码仓库作为 Agent 上下文；代码中已标记 "Currently Not Supported"
- [ ] **Knowledge Source 类型** — `SourceType` 新增 `'knowledge'`；`SOURCE_TYPE_META` 添加对应元数据（label: "Knowledge"，图标 📚）；`AddSourceModal` 在 Dev Mode 下展示；支持手动输入 Markdown 文本；数据存 `workspace_sources` 的 JSON blob
- [ ] **Skill Source 类型** — `SourceType` 新增 `'skill'`；支持用户创建可复用的提示词模板 / 分析框架；`AddSourceModal` 在 Dev Mode 下展示；Skill 内容注入 ACP Agent system prompt
- [ ] **手动集群元数据模拟 Source** — 添加一个仅开发模式可用的手动流程，允许手动输入 mock `cluster_meta` 值（如 cluster_id/org_id/version/时间范围），无需真实 Alert 准备即可测试 MCP 和提示词行为

### MCP / Skill 数据能力扩展

> 注：Clinic / O11Y 数据访问已迁移到 `clinic-api` skill。以下扩展项可作为 skill 子命令或独立 skill 实现，不再强制走 MCP。

- [ ] **MCP Connector 前端可配置** — 用户在 Sources 面板直接配置 MCP 连接参数（endpoint、token），不需要改后端配置文件
- [ ] **MCP 远程模式支持** — 在 Workspace `.opencode/opencode.json` 生成和 Session 引导流程中添加 remote MCP transport 支持（超出本地 stdio 范围）；支持每个连接器的 endpoint/auth 配置和健康检查
- [x] ~~**Clinic Data Proxy API 集成**~~ — 已完成。通过 `clinic-api` skill 的 `POST /data-proxy/query` 端点实现，支持 `slow_query_logs` 和 `topsql` 表的 SQL 查询。
- [ ] **Clinic：Profile 捕获能力** — 添加 skill/工具捕获运行时 Profile 数据（CPU/堆/goroutine 等），将结果持久化到 Workspace 文件，并在 Studio/Files 视图中展示
- [ ] **Clinic：Statement 查询能力** — 添加 skill/工具支持 SQL Statement 级别的查询/检查（按集群、时间范围、digest/语句文本过滤）；返回适合报告生成的结构化输出
- [ ] **Clinic：表结构元数据查询** — 添加 skill/工具获取表结构元数据（数据库/表 DDL、索引、分区信息），支持 Chat/报告流程中的根因分析
- [ ] **TiDB 控制面查询支持（tidb-ctl）** — 添加诊断命令查询能力，附加只读安全操作的防护措施，输出清晰的错误报告

### 测试与评估

> 注：核心测试与评估能力已移至 Milestone #2（TCOC Auto Replayer）。以下为补充项。

- [ ] **诊断成本评估** — 追踪和评估每次诊断的 Token/工具/运行时成本；定义成本预算和成本-质量权衡阈値用于发布门禁
- [ ] **Skills 提示词注入回归测试** — 验证 Workspace Skills 按确定顺序注入到系统提示词，并具备去重和对内置指令的明确优先级
- [ ] **Skills 对诊断的影响测试** — 添加场景评估，验证已启用的 Skill 能改善诊断质量/效率，且关闭时不产生行为泄漏

### ACP Session & Chat 生命周期 & Agent 能力

- [ ] **Workspace 异步化长任务** — 支持后台长时间运行的 Agent 任务（如完整集群诊断扫描）；任务状态 SSE 推送；任务队列管理
- [ ] **Workspace CronJob** — 支持用户为 Workspace 配置定时任务（如每天自动分析一次集群状态）；CronJob 配置界面；后端定时触发 Agent 执行，结果自动生成 Report Artifact
- [ ] **Export 功能** — 将 Investigation Workspace 导出，支持原地配置权限后接入 OpenCode 自行调试
- [ ] **离线持续分析** — 后台离线分析历史诊断数据，持续积累分析结论，沉淀 Knowledge 和 Skills，在后续诊断中使用
- [ ] **Memory & Skills 自动维护** — 添加 Memory 和 Skills 自动维护系统，形成类似于 OpenClaw 的能力
- [ ] **Agent Automation 闭环自动驾驶** — Agent 闭环诊断问题，Fire-and-forget 模式，用户事后查看结果。例如用户提交一个 Alert，Agent 自动分析并生成 Report Artifact + Operation Artifacts，用户不需要实时等待分析结果，可事后查看分析结论。
- [ ] **Multi-Agent 能力** — https://github.com/openclaw/acpx — 允许一些功能以 Agent CLI 方式被调用；设计 Multi-Agent 能力

### UI/UX 优化

#### Studio Artifacts & 报告

- [ ] **Studio Action Cards 实现（Report 生成）** — `StudioPanel` 顶部 Action Cards：点击 "📊 Report" 触发 Agent 分析 → 通过 Chat SSE 流式生成 → 完成后自动创建 Report Artifact；移除 "Coming Soon" 占位状态
- [ ] **Studio Action Cards 实现（Notes）** — 点击 "📝 Notes" 打开 `NoteModal`；支持 Markdown 编辑；保存后创建 `note` 类型 Artifact；Artifact 列表可查看/编辑 Note
- [ ] **Operation List Artifact（变更审批单）** — Studio 支持生成 Operation List Artifact（一键发起线上变更审批单，创建一组变更动作的审批单）；Agent 生成变更步骤 → 前端展示步骤列表 + "提交审批" 按钮；人工审批卡点（暂可为 UI 确认弹窗，未来接真实审批系统）。通过此功能实现自动化诊断 + 一键修复的闭环。

#### Workspace 底层文件和命令行

- [ ] **文件编辑支持** — 目前 `FileViewer`（`components/StudioPanel/FileViewer.tsx`）为只读模式；为文本文件（`.md`、`.json`、`.yaml` 等）添加内联编辑能力；后端实现 `PUT /api/workspace/{id}/file-content` 接口写回文件内容；前端 "Edit" 按钮切换只读 ↔ 编辑模式，Ctrl+S / 保存按钮提交；保存后自动刷新文件树和 Agent 上下文
- [ ] **Pod Terminal 访问**（依赖 Pod 隔离）— 前端新增 Terminal 面板（Xterm.js）；通过 WebSocket（`/ws/workspace/{workspace_id}/terminal`）与 backend 建立通道；backend 在对应用户 pod 内 `exec` shell，双向转发 I/O；支持在 Agent 工作目录内执行调试命令、查看日志、手动操作文件系统

#### Dev Mode & 本地开发体验

- [ ] **Dev Mode 全视图开关** — 新建 `lib/devMode.ts`，export `useDevMode()` hook 读取 `NEXT_PUBLIC_DEV_FULL_VIEW`；在 `AddSourceModal`、`SourcesPanel`、`StudioPanel` 中接入，控制未实现功能的显示/隐藏；生产 Dockerfile 不传此变量


### Admin 后台

- [ ] **Admin 后台骨架** — 新建 `platform/admin/` 目录（独立 FastAPI 服务）；复用 `backend/db.py` SQLite 连接；实现 API：列出所有用户及其 workspace 列表、查看任意 workspace 完整状态（sources + artifacts + messages + files）；添加 `workspace_snapshots` 表（存储完整快照 JSON）
- [ ] **Reproduce & Impersonate** — Admin 界面可选择历史 workspace → 生成完整状态快照 → 前端以该 workspace 视角打开，复现当时状态；底层：`POST /admin/workspaces/{id}/snapshot`，`GET /admin/snapshots/{id}` 重放
- [ ] **后台按需给 Workspace 分配 Alert 工单** — 支持一类坐诊类 Workspace，后台自动分配工单给本周值班同学，并通过 IM 提醒工单分配；也支持手动分配：Admin 界面选择任一 workspace → "Assign Alert" → 输入 Alert ID → 后端将该 Alert 相关数据写入 workspace 文件系统（`data/workspaces/{workspace-id}/`）；前端自动检测到新 Source，触发 Agent 分析
