feat: Bitable P0 UX Polish + Agent Parity #23

Merged
fischer merged 12 commits from feat/bitable-enhancement into main 2026-07-04 01:05:05 +08:00
1 changed files with 106 additions and 30 deletions
Showing only changes of commit f8927d1749 - Show all commits

View File

@ -29,7 +29,7 @@ agentkit bitable 后端 v1 已基本齐全:`BitableFile→Table→Field/Record
- REST 端点28 个,前缀 `/api/v1/bitable``src/agentkit/server/routes/bitable.py`JWT 或 `X-Internal-Token` 认证404-before-403 所有权检查
- 字段类型(后端 `FieldType` 枚举):`text`/`number`/`date`/`select`/`multiselect`/`attachment`/`image`/`formula`/`lookup`9 种)
- 字段所有权:`FieldOwner.agent`/`user`upsert 只更新 agent 列,用户列不被覆盖
- 默认字段5 个模板(标题 `text` / 状态 `select` / 日期 `date` / 创建人 `text` / 创建时间 `date`)——注意 `FieldType` 枚举无 `user`/`datetime` 类型,创建人与创建时间实际是 `text`/`date`
- 默认字段5 个模板(标题 `text` / 状态 `select` / 日期 `date` / 创建人 `text` / 创建时间 `date`)——注意 `FieldType` 枚举无 `user`/`datetime` 类型,创建人与创建时间实际是 `text`/`date`R8 schema V3 后将迁移为 `user`/`datetime`,见默认字段迁移矩阵)
- 公式引擎10 函数(`SUM`/`AVG`/`COUNT`/`MIN`/`MAX`/`ABS`/`ROUND`/`IF`/`LEN`/`CONCAT`AST 节点白名单(见 `formula/parser.py`,永不 eval/execDAG 拓扑排序 + 环检测,异步 `RecalcWorker`0.5s 轮询、300s reaper、600s 过期阈值)
- 跨表引用:单向 `lookup``lookup_target` 配 `table_id`/`field_id`/`filter_field_id`/`filter_value`
- 采集ExcelSSRF 守护的 URL 抓取 + openpyxl`src/agentkit/bitable/ingestion/excel.py`、数据库SQLAlchemy 反射,`database.py`、API形状变换`api_collector.py`
@ -118,7 +118,7 @@ agentkit bitable 后端 v1 已基本齐全:`BitableFile→Table→Field/Record
- **G4.** 视图只有 grid枚举 5 种但只渲染 1 种)——飞书 5-6 种、Twenty 3 种
- **G5.** 字段类型 9 种(前端 UI 8 种无 lookup——飞书 25+、Twenty 20+;关键缺:`user`/`checkbox`/`url`/`email`/`phone`/`auto-number`/`datetime`/`modified-by`/`location`/`barcode`/`rating`/`progress`/`currency`/`rich-text`/`date-range`/`json`/双向关联
- **G6.** 默认字段"创建人"=`text`、"创建时间"=`date`——因 `FieldType``user`/`datetime`,默认字段集本身暴露字段类型缺口
- **G6.** 默认字段"创建人"=`text`、"创建时间"=`date`——因 `FieldType``user`/`datetime`,默认字段集本身暴露字段类型缺口R8 schema V3 迁移将修正:`text` → `user`、`date` → `datetime`
- **G7.** 公式仅 10 函数——缺 `LOOKUP`/`ROLLUP`/`FILTER`/`SORT`/日期函数/条件函数/字符串函数;飞书有丰富函数库 + AI 生成公式
- **G8.** 跨表关联仅单向 lookup——无双向关联、无 rollup 聚合
- **G9.** 无仪表盘——飞书 12+ 图表类型 + 关联多表 + 千人千面
@ -138,7 +138,7 @@ agentkit bitable 后端 v1 已基本齐全:`BitableFile→Table→Field/Record
- **G20.** 协作单用户——飞书实时 + 评论 + 通知Twenty 有 Notes/Tasks/@mention
- **G21.** 无移动端原生——飞书有原生 App
- **G22.** 权限粗粒度——仅文件/表所有权,飞书/Twenty 有字段级/记录级 + SSO + 审计
- **G23.** 前端无采集入口 UI——后端三类采集就位但前端无触发入口2026-06-29 阶段二未做)
- **G23.** 前端无采集入口 UI——后端三类采集就位但前端无触发入口2026-06-29 阶段二未做)。**闭合路径**R15c路径 (a) 新增 `/collections` 端点 + 前端采集入口 UI路径 (b) 由 agent 通过 BitableTool 触发——依赖 R15a 完成)
### 差异化优势(非差距,应加倍投入)
@ -170,7 +170,7 @@ agentkit bitable 后端 v1 已基本齐全:`BitableFile→Table→Field/Record
## Agent 对等评估方法
bitable 后端有 28 个 REST 端点,但 `BitableTool``src/agentkit/tools/bitable_tool.py`)仅暴露 6 个动作(`create_table`/`list_tables`/`query_records`/`create_record`/`update_record`/`delete_record`),存在系统性 agent 孤儿风险。下表为每个 R-ID 标注复用端点、需新增的 BitableTool 动作、以及 agent 孤儿风险等级。
bitable 后端有 28 个 REST 端点,但 `BitableTool``src/agentkit/tools/bitable_tool.py`)仅暴露 6 个动作(`create_table`/`import_excel`/`import_database`/`collect_api`/`upsert_records`/`query_records`),存在系统性 agent 孤儿风险。下表为每个 R-ID 标注复用端点、需新增的 BitableTool 动作、以及 agent 孤儿风险等级。
| R-ID | 复用/新增端点 | BitableTool 需新动作 | Agent 孤儿风险 |
|------|--------------|---------------------|---------------|
@ -180,7 +180,7 @@ bitable 后端有 28 个 REST 端点,但 `BitableTool``src/agentkit/tools/b
| R4 | 复用 PATCH /views需扩展 group_by/conditional_formatting | `update_view` | 高 — agent 无法配置分组/条件格式 |
| R5 | 纯前端 token 系统 | (无需新动作) | 无 |
| R6/R7 | 复用 POST /views + PATCH /views | `create_view`/`update_view`(同 R3/R4 | 中 — 与 R3/R4 共享动作 |
| R8 | 复用 POST /fields需扩展类型枚举 | `create_field`可选R1 的 `update_field` 已覆盖部分 | 中 |
| R8 | 复用 POST /fields需扩展类型枚举 | `create_field`**必需**——17 个新类型需 agent 能批量建字段R1 的 `update_field` 不覆盖创建路径 | 中 |
| R9/R10 | 复用公式引擎(`formula/parser.py`+ POST /fields双向关联 schema | (无需新动作,复用 `create_field`/`update_field` | 低 |
| R11 | 复用 POST /views | `create_view`(同 R3 | 中 |
| R15a | 复用 DELETE /views需新增后端端点 | `delete_view` | 高 — 后端 + agent 双侧缺口 |
@ -199,9 +199,10 @@ bitable 后端有 28 个 REST 端点,但 `BitableTool``src/agentkit/tools/b
- R1. 列内联字段配置:列头菜单直接编辑字段(重命名/改类型/选项管理),不跳右侧抽屉。闭合 G14。
- R2. 记录详情侧边抽屉:行点击展开详情面板,含所有字段类型的可视化展示与编辑。闭合 G15。
- R3. 视图类型切换与创建:`ViewSwitcher` 支持选 grid/kanban/gallery/gantt/form新建视图选类型不再硬编码 grid。P0 暴露全部 5 种类型,未实现的以禁用态展示并标注"规划中"(预告路线图)。闭合 G16为 P1 视图实现铺路。
- R3. 视图类型切换与创建:`ViewSwitcher` 支持选 grid/kanban/gallery/gantt/form新建视图选类型不再硬编码 grid。P0 暴露全部 5 种类型,未实现的以禁用态展示并标注"规划中"(预告路线图)。**后端依赖**POST /views 需扩展 schema 接受 `type` 字段(当前硬编码 grid闭合 G16为 P1 视图实现铺路。
- R4. grid 视图内分组与条件格式:多字段分组 + 规则自动着色。**后端扩展**View.config 新增 `group_by`/`conditional_formatting` schema通过 PATCH /views 暴露。**Agent 对等**BitableTool 的 `create_view`/`update_view` 动作需支持传入这些配置(见 Agent 对等评估方法)。闭合 G17、G18。
- R5. 视觉风格对齐P0 引入统一设计 token 系统CSS 变量层:颜色/间距/圆角/字号),以 token 驱动重写列头/chip/密度等,配套字段类型图标与彩色 chip 标签达飞书水准。闭合 G1、G2、G3。
- R15a. BitableTool 动作补全P0 提升agent 对等最高优先级子项):从 6 个动作扩展到 10 个(新增 `create_view`/`update_view`/`update_field`/`delete_view`),消除与 28 个 REST 端点的 agent 孤儿风险。**与 R3/R4 同步推进**(共享 `create_view`/`update_view` 动作)。强化 D1、D2闭合 Agent 对等缺口(见 Agent 对等评估方法)。
### P1 — 功能广度A 跟进,下一轮 ce-plan
@ -220,7 +221,6 @@ bitable 后端有 28 个 REST 端点,但 `BitableTool``src/agentkit/tools/b
### B 线 — Agent 差异化(贯穿,不阻塞 P0/P1
- R15a. BitableTool 动作补全:从 6 个动作扩展到 10 个(新增 `create_view`/`update_view`/`update_field`/`delete_view`),消除与 28 个 REST 端点的 agent 孤儿风险。强化 D1、D2闭合 Agent 对等缺口(见 Agent 对等评估方法)。
- R15b. 自然语言→表结构 agent 技能agent 接收自然语言描述,调用 BitableTool 完成「建表 + 建字段 + 建视图」一站式编排,作为 agentkit 差异化主线。强化 D1、D2。
- R15c. 定时采集 + 前端采集入口 UI在现有 Excel/DB/API 三类采集基础上新增定时调度能力cron 表达式驱动)+ 前端采集入口 UI闭合 G23。**路径决策**(a) 新增 REST 端点 `/api/v1/bitable/collections`CRUD + 调度器管理);(b) 由 agent 通过 BitableTool 触发(依赖 R15a 完成。ce-plan 阶段二选一。
@ -259,6 +259,25 @@ bitable 后端有 28 个 REST 端点,但 `BitableTool``src/agentkit/tools/b
- Given select 选项 chipWhen 渲染Then 对比度 ≥4.5:1WCAG AAaxe-core 可测试)
- Given chip 配色When 审计Then 全部来自 design token 调色板
**R15a. BitableTool 动作补全 + 视图删除端点**
- Given BitableToolWhen 调用 `create_view`/`update_view`/`update_field`/`delete_view`Then 4 个新动作全部可用BitableTool 从 6 扩展到 10 个动作)
- Given 视图列表When 用户点击删除Then 调用 DELETE /views/{id}**后端需新增端点**,前端 api/bitable.ts 需补 `deleteView` 方法——见 Outstanding Questions
- Given R3/R4 配置变更When agent 调用 `create_view`/`update_view` 传 `type`/`group_by`/`conditional_formatting`Then 配置成功写入(与 REST PATCH /views 等价)
- Given 字段配置When agent 调用 `update_field`Then 与 PATCH /fields/{id} 等价agent 不再需要绕过工具直接调 REST
**横切验收标准(适用所有 P0 R-ID**
可访问性WCAG AA
- Given 任何交互元素(按钮/链接/单元格/抽屉触发When 键盘 Tab 导航Then 可达且焦点可见focus-visible 样式)
- Given grid 视图When 屏幕阅读器遍历Then 列头/单元格有正确 ARIA role 与 label`role="grid"`/`role="columnheader"`/`aria-label`
- Given select/multiselect 编辑器When 键盘操作Then 方向键导航 + Enter 选中 + Esc 关闭(不依赖鼠标)
- Given 颜色对比度审计When axe-core 扫描Then 所有关键文本 ≥4.5:1、大字号 ≥3:1WCAG AA
空状态(无数据时):
- Given 新建表无字段无记录When 渲染 gridThen 显示"暂无字段,点击列头 + 创建"+ "暂无记录"双空状态
- Given 视图列表为空When 渲染 ViewSwitcherThen 显示"暂无视图,新建 grid 视图"提示(非空白)
- Given 抽屉/筛选器/分组无数据When 渲染Then 显示对应空状态文案(非空白、非报错)
---
## Test Strategy
@ -275,35 +294,41 @@ bitable 后端有 28 个 REST 端点,但 `BitableTool``src/agentkit/tools/b
| R4 | new: test_grouping.py + test_conditional_formatting.py | helpers/groupingRulesUtils.ts | new: bitable-grouping.spec.ts | - |
| R5 | - | helpers/designTokenAudit.tsgrep token 使用) | bitable-view.spec.tsvisual regression | - |
| R8 | test_models.py + test_default_fields.py + test_service.py | helpers/fieldTypeUtils.ts | bitable-field-ops.spec.tsextend | integrationschema V3 迁移) |
| R15 | test_bitable_tool.pynew actions | - | new: bitable-agent-parity.spec.ts | redisnotify_callback |
| R15a | test_bitable_tool.py4 new actions: create_view/update_view/update_field/delete_view | - | new: bitable-agent-parity.spec.ts | redisnotify_callback |
| R15b | new: test_nl_to_table.pyagent 编排:建表 + 建字段 + 建视图) | helpers/nlTableUtils.ts | new: bitable-nl-table.spec.ts | redisagent 编排) |
| R15c | new: test_collections.pyCRUD + 调度器)+ test_collection_security.pySSRF/凭据) | helpers/collectionSchedulerUtils.ts | new: bitable-collection-ui.spec.ts | postgres调度持久化、rediscron 触发) |
**Agent 对等测试契约**:每个 P0/P1 R-ID 交付时,附 BitableTool 调用契约测试——验证 agent 能完成等价操作(人类可做的 agent 也能做。BitableTool 当前 6 actions vs 28 REST 端点,新增端点的 R-ID 需同步补 BitableTool 动作 + 契约测试。
**R15c 测试策略补充**:路径 (a) `/collections` 端点需覆盖 (1) CRUD 正常路径;(2) cron 表达式校验与调度触发;(3) SSRF 守护复用 `excel.py` 的 URL 白名单逻辑;(4) 凭据加密存储(建议复用 agentkit 现有 secrets 模块,禁明文);(5) 端点访问控制JWT 或 `X-Internal-Token`(与 28 个既有端点一致)。路径 (b) 由 agent 通过 BitableTool 触发,复用 R15a 测试契约,无需单独端点测试。
---
## R8 Field Type Acceptance Matrix
R8 扩展的 16 字段类型 + 1 双向关联的逐类型验收标准。每行映射约 4-6 个单元测试test_models.py / test_service.py / test_default_fields.py
R8 扩展的 16 字段类型 + 1 双向关联的逐类型验收标准**覆盖 P1 范围,非 P0**——P0 验收标准见 Acceptance Criteria (P0)。每行映射约 4-6 个单元测试test_models.py / test_service.py / test_default_fields.py
| 类型 | 有效输入 | 无效输入422 | 所有权 | 公式参与 | V2→V3 迁移 |
|---|---|---|---|---|---|
| `user` | user_id 字符串 | 非存在 user_id | both | 不支持 | 创建人 `text``user` |
| `checkbox` | `true`/`false` | 非布尔值 | both | 支持IF 条件) | - |
| `url` | `https://example.com` | 非合法 URL | both | 不支持 | - |
| `email` | `a@b.com` | 非合法邮箱 | both | 不支持 | - |
| `phone` | `+86-...` 字符串 | 空字符串 OK | both | 不支持 | - |
| `auto-number` | 自增整数(后端分配) | 不可手动写 | agent only | 不支持 | - |
| `datetime` | ISO 8601 `2026-07-03T12:00:00Z` | 非日期格式 | both | 支持(日期函数) | 创建时间 `date``datetime` |
| `modified-by` | user_id自动管理 | 不可手动写 | agent only | 不支持 | - |
| `location` | `{lat: float, lng: float}` | 非合法坐标 | both | 不支持 | - |
| `barcode` | 字符串 | 空字符串 OK | both | 不支持 | - |
| `rating` | 1-5 整数 | 超范围 | both | 支持AVG | - |
| `progress` | 0-100 整数 | 超范围 | both | 支持AVG | - |
| `currency` | `{amount: number, code: str}` | 负数 OK | both | 支持SUM | - |
| `rich-text` | HTML 子集(无 `<script>` | 含 `<script>` 标签 | both | 不支持 | - |
| `date-range` | `{start: ISO, end: ISO}` | `end < start` | both | 不支持 | - |
| `json` | 任意合法 JSON | 非法 JSON | both | 不支持 | - |
| 双向关联 | `target_record_id` | 非存在 record | both | 支持ROLLUP | 新增,无 V2 数据 |
**Schema V3 迁移成本估算**17 个新类型中 2 个需 V2→V3 数据迁移(`user`/`datetime`1 个需双向关联 schema无 V2 数据。预估后端工作量models.py 扩展 + migration 脚本 + RecalcWorker cache 失效路径 + service 兼容层 ≈ 3-5 个工作日。前端工作量FieldConfigForm.vue 8 类型 → 24 类型 + SelectCellEditor 扩展 ≈ 4-6 个工作日。回滚策略见 Outstanding Questions。
| 类型 | 有效输入 | 无效输入422 | 所有权 | 公式参与 | V2→V3 迁移 | PII / 安全 |
|---|---|---|---|---|---|---|
| `user` | user_id 字符串 | 非存在 user_id | both | 不支持 | 创建人 `text``user` | **PII**user_id 不直接暴露用户邮箱/手机,但需脱敏日志 |
| `checkbox` | `true`/`false` | 非布尔值 | both | 支持IF 条件) | - | - |
| `url` | `https://example.com` | 非合法 URL | both | 不支持 | - | - |
| `email` | `a@b.com` | 非合法邮箱 | both | 不支持 | - | **PII**:列表/导出需脱敏选项agent 写入需脱敏审计 |
| `phone` | `+86-...` 字符串 | 空字符串 OK | both | 不支持 | - | **PII**:同 `email` |
| `auto-number` | 自增整数(后端分配) | 不可手动写agent 侧写保护BitableTool `create_record`/`upsert_records` 拒绝传 auto-number 字段) | agent only | 不支持 | - | - |
| `datetime` | ISO 8601 `2026-07-03T12:00:00Z` | 非日期格式 | both | 支持(日期函数) | 创建时间 `date``datetime` | - |
| `modified-by` | user_id自动管理 | 不可手动写agent 侧同 `auto-number` | agent only | 不支持 | - | **PII**:同 `user` |
| `location` | `{lat: float, lng: float}` | 非合法坐标 | both | 不支持 | - | - |
| `barcode` | 字符串 | 空字符串 OK | both | 不支持 | - | - |
| `rating` | 1-5 整数 | 超范围 | both | 支持AVG | - | - |
| `progress` | 0-100 整数 | 超范围 | both | 支持AVG | - | - |
| `currency` | `{amount: number, code: str}` | 负数 OK | both | 支持SUM | - | - |
| `rich-text` | HTML 子集(白名单标签/属性,**服务端 sanitize**——禁 `<script>`/`<iframe>`/`on*` 事件属性,建议复用 `bleach` 或等价库;前端渲染前再过一遍 DOMPurify | 含 `<script>`/`<iframe>`/`on*` 事件属性 | both | 不支持 | - | **XSS**:双清洗(服务端 + 前端CSP 头限制 |
| `date-range` | `{start: ISO, end: ISO}` | `end < start` | both | 不支持 | - | - |
| `json` | 任意合法 JSON | 非法 JSON | both | 不支持 | - | - |
| 双向关联 | `target_record_id` | 非存在 record | both | 支持ROLLUP | 新增,无 V2 数据 | - |
**迁移测试**V2 → V3 迁移需覆盖 (a) 创建人 `text``user`(现有值保留为字符串,运行时解析为 user_id(b) 创建时间 `date``datetime`(现有值追加 `T00:00:00Z`(c) 未迁移字段行为不变(旧字段 `type='text'` 不因新类型引入而变)。
@ -338,7 +363,7 @@ R8 扩展的 16 字段类型 + 1 双向关联的逐类型验收标准。每行
## Dependencies / Assumptions
- **依赖**:后端 v1 齐全28 端点 + 公式引擎 + 三类采集P0 主要在前端
- **依赖**vxe-table 4 已用于 `BitableGrid`,继续作为 grid 实现基础
- **依赖**vxe-table 4 已用于 `BitableGrid`,继续作为 grid 实现基础。**注**:当前为幽灵依赖——`BitableGrid.vue` 直接 `import 'vxe-table'`,但 `src/agentkit/server/frontend/package.json` 未声明,仅靠主仓 `node_modules` hoisting 解析。R1/R3 实施前需在 frontend `package.json` 显式声明 `vxe-table``vxe-pc-ui` 版本(消除 hoisting 风险)
- **依赖**Ant Design Vue 4 + Vue 3 + Pinia + TypeScript强类型禁 any
- **假设**:现有 PostgreSQL 性能足以支撑 v1/v2 规模;大规模(百万行)延后 v3
- **假设**用户接受分阶段交付P0 先行可独立验证
@ -360,7 +385,58 @@ R8 扩展的 16 字段类型 + 1 双向关联的逐类型验收标准。每行
- 看板视图R6组件选型自建 vs 现成库
- 公式库扩展R9是否引入第三方 formula-parser
- `FieldType` 扩展的 schema V3 迁移策略
- 视图删除端点(后端 + 前端均缺 `deleteView`)是否在 P0 补齐
### From 2026-07-03 review
ce-doc-review7 reviewers经 best-judgment 路径处理的 12 个 manual findings需 ce-plan 阶段决策:
- **user 字段用户模型** — R8 验收矩阵 (P1, feasibility, confidence 100)
`user`/`modified-by` 字段类型引用 `user_id`,但 agentkit 当前无统一的 user 模型抽象bitable 的 `FieldOwner.user` 仅标识所有权,不解析为用户实体)。需明确:(1) user_id 是 agentkit 内部 ID 还是外部系统 ID(2) 是否复用 server/auth 的用户表;(3) 跨表查询用户名时如何解析。
- **C 先行优先级策略的实证依据** — Key Decisions KD1 (P1, adversarial, confidence 75)
KD1 主张"C 先行UX 打磨)→ A 跟进",但未给出实证依据(无用户访谈、无 A/B 数据、无竞品上市时序分析)。产品价值判断需 ce-plan 阶段补充:(1) 飞书/Twenty 的迭代史是否支持 UX 先行;(2) agentkit 当前用户是否反馈过 grid 体验问题;(3) B 线agent 差异化)是否才是真正护城河。
- **并发编辑 UX 策略** — Three-Way Comparison (P1, design-lens, confidence 75)
飞书支持实时协作agentkit 有 agent + 用户双写入场景upsert 保留用户列)。需决策:(1) 同一记录被 agent 与用户同时编辑时的冲突解决last-write-wins vs 字段级合并 vs 提示用户);(2) 是否需要 optimistic lockingversion 字段);(3) UI 上是否提示"agent 已更新此字段"。
- **加载/错误状态统一模式** — Acceptance Criteria (P2, design-lens, confidence 75)
文档未规定异步加载(公式重算、采集、视图切换)与错误状态的统一交互模式。需 ce-plan 决策:(1) 加载态用骨架屏还是 spinner(2) 错误态用 toast 还是行内提示;(3) RecalcWorker 失败时的回退展示。
- **条件格式规则构建器 UX 形态** — Acceptance Criteria R4 (P2, design-lens, confidence 75)
R4 验收标准列出 7 个运算符,但未规定规则编辑器形态。需决策:(1) 向导式step-by-stepvs 列表式rule listvs DSL类 Excel 公式);(2) 单规则多条件 vs 多规则单条件;(3) 规则预览如何展示(实时着色样本 vs 描述文本)。
- **分组交互细节** — Acceptance Criteria R4 (P2, design-lens, confidence 75)
R4 验收"最多 3 字段分组"但未规定交互。需决策:(1) 分组层级折叠/展开(默认折叠还是展开);(2) 多字段分组的排序规则(首字段优先 vs 用户可调);(3) 分组头部是否显示聚合行(计数/求和/平均值);(4) 拖拽分组字段调整层级。
- **响应式断点定义** — Scope Boundaries (P2, design-lens, confidence 75)
文档标注"响应式 web"但未给断点。需 ce-plan 决策:(1) 移动/平板/桌面三档断点(建议 768/1024/1440(2) grid 视图在小屏是否降级为卡片列表;(3) 抽屉在小屏是否全屏覆盖。
- **R2 记录详情抽屉宽度** — Deferred to Planning (P2, coherence, confidence 75)
既有"单列纵向 vs 双列紧凑"未决。补充考虑:(1) 字段数超过 20 时单列纵向滚动成本;(2) 双列紧凑在窄屏的退化形态;(3) 与 R5 design token 间距系统对齐(建议宽度 480/640/800 三档)。
- **vxe-table 容量上限评估** — Dependencies (P2, feasibility, confidence 100)
依赖 vxe-table 4 但未评估单表行数上限。需 ce-plan 阶段实测:(1) vxe-table 4 在 1 万 / 10 万 / 100 万行下的渲染性能(首屏 / 滚动 / 编辑延迟);(2) 是否需要虚拟滚动vxe-table 内置 vs 自定义);(3) 与"PG 部门级(<10 万行"假设是否匹配
- **R13 仪表盘图表库 buy-vs-build** — Priority Recommendations (P2, scope-guardian, confidence 75)
R13 列"图表组件库 + 关联多表"但未选型。需决策:(1) 自建 SVG/Canvas 图表 vs 引入库ECharts/Chart.js/AntV G2(2) 引入库的 license 兼容性agentkit 非开源,需商业授权);(3) 12+ 图表类型的实现优先级(先做柱/折/饼,还是全量)。
- **禁用态视图类型路线图** — Acceptance Criteria R3 (P3, product-lens, confidence 50)
R3 规定未实现视图以禁用态展示 + "规划中"标注,但未规定解锁路径。需决策:(1) 禁用态点击是否弹出路线图(具体版本/时间);(2) 路线图信息从哪里读取hardcode vs config vs 远端);(3) 用户是否能"投票"解锁(需求收集机制)。
- **schema V3 双向关联回滚策略** — R8 Field Type Acceptance Matrix (P3, feasibility, confidence 50)
R8 矩阵列"双向关联:新增,无 V2 数据",但 V3 迁移失败时的回滚未定义。需决策:(1) 双向关联是 schema-only 变更还是数据变更;(2) 回滚是 drop column 还是保留为 text 字段;(3) 已建立的双向关联数据在回滚后如何展示(只读 vs 隐藏)。
---