Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .changeset/acceptance-17-rc2-test-plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
---

docs: revised 17.0 GA acceptance test plan for rc.2 (docs-only, no package changes)
120 changes: 120 additions & 0 deletions docs/acceptance-17/HANDOFF.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# rc.2 验收 —— 交接说明

> ✅ **本轮验收已全部完成(8/8 节)。** 本页最初为中途交接而写,现保留作为"如何重跑/续验"
> 的操作指南与踩坑清单。结论看 [test-report.md](./test-report.md);GA 复归清单看其 §11。
> **一句话结论:当前状态不建议 GA 放行** —— 权限模型默认开放(#703/#704 p0)、线索 UI 无法
> 创建(#688 p0)、所有权/写模型破碎(#548/#700/#705)、系统驱动自动化全断含审批绕过(#684)。

给接手复验或修复的下一位(或下一个会话)。**先读这一页,再读别的。**

- **PR**:[#676](https://github.com/objectstack-ai/hotcrm/pull/676)(draft),分支
`claude/hotcrm-17-rc1-acceptance-hj869o`,基于 `main` @ 5a78f88
- **被测版本**:`@objectstack/*` **17.0.0-rc.2**(任务原文说 rc.1,但 main 已由 #663 升到 rc.2)
- **纪律**:**只测不修** —— 不改 `src/`,发现问题建 issue。上一轮 `src/` 零改动,请保持

## 一、这一页之外该读什么

| 文件 | 用途 |
|---|---|
| [test-plan.md](./test-plan.md) | 验收计划(8 节),已按 rc.2 修订 |
| [test-report.md](./test-report.md) | 报告。**§10 列出未执行项,§11 是 GA 最小回归清单** |
| [parallel-task-packages.md](./parallel-task-packages.md) | 剩余工作的 P1–P5 任务包,**直接照着投** |
| [evidence/](./evidence/) | 上一轮的执行记录与准备资产(见下) |

## 二、进度:8/8 节全部完成

| 计划节 | 状态 |
|---|---|
| 0 自动化基线 | ✅ verify 1280 例、e2e 16/16、冷启动 0 ERROR |
| 1 对象列表/详情 | ✅ 15/17 通过(2 项曾因无种子阻塞,W1 自建记录后补测通过) |
| 2 对象 CRUD | ✅ REST 17/17 全量通过 |
| 3 actions 全量(26 个) | ✅ 25 通过 / 1 失败(#508) |
| 4 仪表盘/报表 | ✅ 5 仪表盘 56 widget、10 报表全部出数 |
| 5 flows 全量(24 条) | ✅ 24/24 通过;#684 判定:用户路径健康/系统路径全断 |
| 6 profile 权限矩阵 | ✅ 188 探针,**矩阵不成立**,5 平台根因(#703-707) |
| 7 i18n 四语言 | ✅ zh-CN 完整,ja/es 有实质缺口 |
| 8 阻塞 issue 复测 | ✅ 10/10:9 解除 / 1 仍复现(#508) |

**若要复验或修复后回归**,按 [parallel-task-packages.md](./parallel-task-packages.md) 的
P1–P5 包重跑对应部分即可;每包自带记录前缀与隔离约定。

## 三、上手三步

```bash
cd /home/user/hotcrm # 若是新容器,先 clone 并 checkout 上述分支
pnpm install
pnpm dev # 端口 4001,等 /api/v1/health 返回 200(约 30s)
```

鉴权(**这一条能省你半小时**):

```bash
TOKEN=$(curl -s -X POST http://localhost:4001/api/v1/auth/sign-in/email \
-H 'Content-Type: application/json' \
-d '{"email":"admin@objectos.ai","password":"admin123"}' | node -pe 'JSON.parse(require("fs").readFileSync(0)).token')
```

然后照 [parallel-task-packages.md](./parallel-task-packages.md) 投 **P2 → P3 → P4 → P5**。
写数据的包之间要么串行,要么各用各的前缀(P2 用 `RC1ACC-P2-`,依此类推)。

## 四、踩过的坑,别再踩一遍

1. **鉴权端点是 `/api/v1/auth/sign-in/email`**。直觉的 `/api/v1/auth/login` 返回 **500**
而不是 404,极易误判成"服务挂了"。
2. **三个入口默认三个不同的 SQLite 库**:`objectstack dev` → `dev.db`;
`objectstack start` → `objectstack.db`;migrate CLI → `standalone.db`。
所以 `os migrate plan` **默认根本没看 dev server 的库**;复测 #528 必须显式传
`--database-url file:/home/user/hotcrm/.objectstack/data/dev.db`。
另:`migrate plan` 自称 dry-run,却会**新建** `standalone.db` 文件。
3. **控制台 SPA 首次导航要等 8–10 秒**。等太短会读到"列表页没有 New 按钮"这类假象 ——
上一轮踩过,是测试假象不是缺陷。
4. **看板拖拽必须用真实鼠标 API**(`mouse.down` + 多步插值 `move` + `up`);
合成 `dispatchEvent` 不触发 dnd 库。用真实 API 是**可以**自动化验证的
(rc.0 报告说"不可自动化",已被本轮推翻)。
5. **行项目 rollup 是 async**,别在写入的同一 tick 断言父记录金额。
6. **表单弹窗是 `[role="dialog"]`,lookup 选择器会再开一层**,要 `.last()`。
7. **删除测试数据要按子→父顺序**,而且:报名过市场活动的线索删不掉(#696),
得先删 campaign member。
8. **别做这三件事**:重启/重建 dev server(会毁掉别人的在途数据)、`pnpm demo:reset`、
`os migrate apply`。#526 的验证要另起独立端口 + 独立库。

## 五、必须先看的两条判定

- **#688(p0)** console 表单无视 `visibleOn` 却强制其 `required` ——
**`crm_lead` 在界面上完全无法创建**。这是应用的头号演示路径,GA 前必须修。
- **#684** 记录变更流缺 `runAs: 'system'`,系统驱动的写入下自动化被拒。
**P3 包的关键任务**:验证**用户会话驱动**的写入路径是否正常 —— 这决定 #684 是
"系统写入下自动化失效"还是更严重。结论请回填到 #684 评论。

## 六、一条悬而未决、**故意没立案**的观察

admin 删除部分记录返回 **403 FORBIDDEN "insufficient privileges to delete"**,
尤其是活动类 action 创建的 `crm_event`(而 W1 用 REST 自建的 event 删除是 200,
差别在创建路径)。

**没立案的原因**:它很可能是既有 **#548**(app `owner` lookup 与平台 `owner_id` 不一致)
的症状,未做隔离验证前立新案有重复风险。**做 P4 时请优先验证这一条**,
然后要么回填 #548,要么据此另立新案。

## 七、evidence/ 里有什么

| 文件 | 内容 |
|---|---|
| `retest-playbook.md` | 10 条阻塞 issue 的可执行复现手册。**注意:它的 auth 章节是错的**(猜了 `/auth/login`),用本页第三节的端点 |
| `permission-matrix.md` | 5 profile × 17 对象的权限期望矩阵 + 测试用户创建方式,**P4 的输入** |
| `r1-objects.md` | 对象列表/详情逐项结果 |
| `r2-analytics.md` | 仪表盘 widget 级 + 报表逐项结果,含 #520/#523 的判定依据 |
| `r3-i18n.md` | 四语言矩阵、lint 量化、locale 切换机制 |
| `w1-crud.md` | 17 对象 CRUD 矩阵 + C1–C6 定向检查全文 |
| `w1-ledger.md` | W1 的数据台账(已全部清理,留作格式范例) |

**截图没有入库**:约 200 张、33MB,留在上一轮容器的 `/tmp` 里,**已随容器回收丢失**。
报告与 issue 里按文件名引用它们,那些引用现在只表示"当时拍过",无法再打开。
需要视觉证据的判定(尤其 #688)请在你的环境重拍。

## 八、上一轮结束时的环境状态

- 上一轮在 W2(actions)开始不久因额度耗尽终止,W2 留下的测试记录已尽力清理,
仍有少量 `RC1ACC-W2-` 残留(6 event / 2 case / 2 opportunity / 4 contact / 5 lead / 1 account)。
那个库是容器内临时 SQLite,**已随容器回收**,你会拿到全新种子库。
- PR #676 的订阅已退订(避免 Vercel bot 反复唤醒会话消耗额度)。你若要盯 CI,自行重新订阅。
35 changes: 35 additions & 0 deletions docs/acceptance-17/evidence/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# evidence/ —— rc.2 验收的执行记录与准备资产

本目录是 2026-08-05 那轮验收的原始产物,供复核判定、或接手时直接复用。
入口页是 [../HANDOFF.md](../HANDOFF.md),结论页是 [../test-report.md](../test-report.md)。

## 准备资产(下一轮可直接用)

| 文件 | 内容 | 用途 |
|---|---|---|
| `retest-playbook.md` | 10 条阻塞 issue 的可执行复现手册,逐条给出 REST 命令、FIXED/仍复现 的判据、上游 issue 关联、是否写数据 | P2/P5 包的输入。**其 auth 章节有误** —— 它猜测端点是 `/auth/login`,实际是 `/api/v1/auth/sign-in/email` |
| `permission-matrix.md` | 5 profile × 17 对象的声明期望矩阵、字段级权限、sharing 规则、可 API 校验的断言清单、测试用户创建方式 | P4 包的输入 |

## 执行记录

| 文件 | 执行者 | 范围 |
|---|---|---|
| `r1-objects.md` | R1(只读) | 14 个带视图对象的列表/详情 + 3 个子对象经父相关列表 |
| `r2-analytics.md` | R2(只读) | 5 仪表盘(widget 级)+ 10 报表;含 #520 与 #523 的解除判定依据 |
| `r3-i18n.md` | R3(只读) | en / zh-CN / ja-JP / es-ES 四语言矩阵、lint 量化、locale 切换机制 |
| `w1-crud.md` | W1(写) | 17 对象全量 CRUD 矩阵 + C1–C6 定向检查 + 6 条新发现的完整论证 |
| `w1-ledger.md` | W1(写) | 数据台账。记录已全部清理,保留作为台账格式范例 |

W2(actions + 阻塞复测)在开始不久后因额度耗尽被终止,无有效结论,故无记录文件。

## 关于截图

四位执行者共产出约 **200 张截图(33MB)**,**未入库**,留在当时容器的 `/tmp` scratchpad 中,
**已随容器回收而丢失**。

上述记录文件、[../test-report.md](../test-report.md) 以及本轮所立的 issue 中,
仍按文件名引用这些截图(如 `shots/uif-crm_lead-02-after-submit.png`)。
这些引用现在只说明"当时确实拍过该证据",**无法再打开**。

需要视觉证据的判定 —— 尤其 **#688**(`crm_lead` UI 无法创建)—— 请在接手环境重新截取。
纯 REST 判定不受影响:状态码与响应体都完整写在记录里。
Loading
Loading