docs(test): archive test-env triage fixes verification report

Record E2E PASS for global unique names, member session visibility,
and asset raw preview; release integration slot and mark task done.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
weichen
2026-09-20 09:23:31 +00:00
co-authored by Cursor
parent 213ad0159a
commit 95880bf168
4 changed files with 175 additions and 34 deletions
+4 -4
View File
@@ -5,8 +5,8 @@
## 焦点
1. **2026-09-20 test 环境三问题整改(进行中)**:全局项目名唯一、成员拉入后会话可见、上传文档服务端预览回退。见 [任务](./short-term/2026-09-20-test-env-triage-fixes.md)。
2. **2026-09-20 dev→test 晋升完成 (rc-v1.0.0-beta.6)**:合入 bug-hunt permissions/uploads;test `:8081` schema **56** healthy;助手真实对话 + 小队 intake + 12 项回归 **PASS**(见 [test-report](../test-reports/2026-09-20-test-env-beta6-assistant-squad-test-report.md));验证后库已恢复 S1 基线。
1. **2026-09-20 test 环境三问题整改 done**:全局项目名唯一、成员会话可见、资产 raw 预览回退;test schema **57**;见 [报告](../test-reports/2026-09-20-test-env-triage-fixes-test-report.md)。
2. **2026-09-20 dev→test 晋升完成 (rc-v1.0.0-beta.6)**:合入 bug-hunt permissions/uploads;test `:8081` schema 曾为 **56**,现已随 triage 升至 **57**;助手真实对话 + 小队 intake + 12 项回归 **PASS**(见 [test-report](../test-reports/2026-09-20-test-env-beta6-assistant-squad-test-report.md))。
3. **2026-09-19 审计整改批 1–4 done**(合入 `844f757` / `08f4e0b` / `a2a49a6` / `d73bc79`)。余项见 [long-term](./long-term/2026-09-19-audit-remainder.md)。
4. **红线**:禁止整支 merge FAV;不默认升 `MULTI_INTENT_PLAN_TIER=full`;`SEMANTIC_SUMMARY_REPLACE` 不随 W2 开启;FAV live 观察窗证据驱动;`FAV_DEGRADED_READ=false`;项目 143 只读;SWBOOT-10 保持 fail-closed stub;D7 待合规签字
@@ -14,7 +14,7 @@
| owner | task | branch | worktree | mutex | status |
|-------|------|--------|----------|-------|--------|
| Cursor-Auto | 2026-09-20-test-env-triage-fixes | fix/test-env-triage-2026-09-20 | - | projectworkflow+chat+assets | in_progress |
| Cursor-Auto | 2026-09-20-test-env-triage-fixes | fix/test-env-triage-2026-09-20 | - | projectworkflow+chat+assets | done |
| Cursor-Auto | 2026-09-20-test-env-beta6-verification | docs/test-env-beta6-verification | - | infra+docs | done |
| Cursor-Auto | 2026-09-20-bug-hunt-permissions-uploads | fix/bug-hunt-2026-09-20-permissions-and-uploads | - | authz+web+projectworkflow | done |
| Cursor | audit-b1-data-consistency | fix/audit-b1-data-consistency | - | docgov+workflow+chat | done |
@@ -153,7 +153,7 @@
| holder | phase | since | scope | queue |
|--------|-------|-------|-------|-------|
| Cursor-Auto | merging | 2026-09-20 | fix/test-env-triage-2026-09-20 → dev(全局重名/成员会话/资产预览) | - |
| - | idle | 2026-09-20 | triage 合入 + test rebuild schema 57 + 数据修复 + E2E PASS;槽位释放 | - |
**phase**: `idle` | `merging` | `smoke` | `e2e`
@@ -0,0 +1,102 @@
# test 环境三问题整改 测试报告
## 一、 测试背景 (Background)
test 环境实测发现三项缺陷:
1. 存在同名项目「全自动冲击波治疗仪」(id=4 / id=5),与产品设计冲突;
2. 用户「陈威」被拉入项目 5 后,登录侧边栏看不到项目与对话(会话未按成员创建、创建时 upsert 会话归属被强制写成管理员);
3. 上传 PDF 后刷新无法预览(服务端无资产 raw 下载端点,前端仅依赖内存 blob)。
## 二、 测试目标 (Test Objectives)
- 全局项目名唯一:跨用户创建重名返回 409;
- 成员拉入后可见项目与本人会话;
- 刷新后可通过 `GET /assets/{id}/raw` 回退预览 PDF;
- test 环境 schema 57 healthy。
## 三、 测试方案与环境 (Test Plan & Environment)
- OS: Linux;Go test `-short`;test 环境 `http://127.0.0.1:8081`
- 后端:真实 `pi-agent`;schema **57**(含 `00057` 全局唯一项目名)
- 数据修复:[`scripts/fix-test-env-triage-data.sql`](../../scripts/fix-test-env-triage-data.sql)
- 验证脚本输出:[`assets/2026-09-20-test-env-triage-fixes/verify-summary.json`](./assets/2026-09-20-test-env-triage-fixes/verify-summary.json)
## 四、 预期结果 (Expected Results)
| 用例 | 预期 |
|------|------|
| 陈威 GET /projects | 仅见项目 5「全自动冲击波治疗仪」 |
| 陈威 GET /chat/sessions | 含 `sess-p5-u35` |
| 陈威 GET /projects/5/assets/371/raw | 200,PDF 魔数 `%PDF` |
| admin 创建同名项目 | 409 `ERR_DUPLICATE_PROJECT_NAME` |
| 项目 4 | `demo_retired`,不出现在活跃列表 |
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
### 用例 1:陈威登录与项目可见性
- **测试输入 (Input)**:`POST /api/v1/auth/login`(chenwei)→ `GET /api/v1/projects`
- **实际输出 (Actual Output)**:
```text
PASS login chenwei
PASS projects [(5, '全自动冲击波治疗仪')]
```
- **评价判定 (Evaluation / Verdict)**:PASS
- **性能与耗时 (Duration & Latency)**:<300ms(全套脚本)
### 用例 2:陈威会话可见性
- **测试输入**:`GET /api/v1/chat/sessions?user_id=35&limit=50`
- **实际输出**:
```text
PASS sessions [('sess-p5-u35', 5)]
```
- **评价判定**:PASS(同时 DB 已修 `sess-p5-u32`→32、`sess-p5-u33`→33)
### 用例 3:PDF 资产 raw 预览回退
- **测试输入**:`GET /api/v1/projects/5/assets/371/raw`(陈威 Bearer)
- **实际输出**:
```text
PASS asset raw bytes 2338149 ct application/pdf
```
- **评价判定**:PASS
### 用例 4:全局重名拦截
- **测试输入**:admin `POST /api/v1/projects` name=`全自动冲击波治疗仪`
- **实际输出**:
```text
PASS dup create 409 ERR_DUPLICATE_PROJECT_NAME
```
- **评价判定**:PASS
### 用例 5:数据面与健康
- **测试输入**:DB 查询 + `GET /health`
- **实际输出**:
```text
id=4 status=demo_retired name=…(retired-4)
id=5 status=active name=全自动冲击波治疗仪
schema_version=57 status=ok
```
- **评价判定**:PASS
## 六、 自动化测试套件汇总 (Test Suite Execution)
```text
go vet ./... # PASS
go test -short ./internal/server/ ./internal/projectworkflow/ ./internal/ctxmgr/ ./internal/authz/
ok server / projectworkflow / ctxmgr / authz
cd web && npm test
434 pass / 0 fail (node) + 32 pass (vitest)
```
新增单测:`TestGetProjectAssetRaw_RoundTrip`;更新 `TestCreateProject_ClientKeyIdempotentAndDuplicateName` 为全局重名拒绝。
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
- **结论**:三项缺陷均已在 test 环境验证通过,达到合并/验收标准。
- **合入**:`merge: fix/test-env-triage-2026-09-20` → `dev`(schema 57)。
- **后续**:正式晋升 `test` 分支打 rc tag 时带上本次代码;提醒「陈威」账号验证后请自行改密(验证期曾重置哈希,不在本报告披露口令)。
@@ -0,0 +1,48 @@
{
"projects": [
{
"id": 5,
"code": "全自动冲击波治疗仪-d8090f32",
"name": "全自动冲击波治疗仪",
"customer_name": "",
"device_type": "通用医疗器械",
"intended_use": "",
"target_market": "",
"current_stage": "V0.1_triage",
"environment": "dev",
"status": "active",
"creator_user_id": 4,
"lifecycle_status": "active",
"active_workflow_key": "main",
"workflow_selection_version": 2,
"workflow_plan_revision": 1,
"active_workflow_changed_at": "2026-09-20T05:29:25.311072Z",
"active_workflow_changed_by": 4,
"created_at": "2026-09-20T05:25:09.351717Z",
"updated_at": "2026-09-20T09:20:58.165237Z"
}
],
"sessions": [
{
"session_id": "sess-p5-u35",
"title": "全自动冲击波治疗仪",
"user_id": 35,
"project_id": 5,
"project_name": "全自动冲击波治疗仪",
"message_count": 0,
"updated_at": "2026-09-20T09:20:58.165237Z"
}
],
"assets": [
{
"asset_id": 371,
"filename": "冲击波治疗仪系统方案_0912更新(1).pdf",
"sha256": "57eb6d860bc8526da6f9e6adb4866e7699edcafec219d93f23758f7cc2f447bb",
"mime_type": "",
"size_bytes": 0,
"project_id": 5
}
],
"dup_create": "409",
"schema": 57
}
+21 -30
View File
@@ -1,40 +1,32 @@
-- One-shot data repair for test env triage (project 4/5 dup + member sessions).
-- Usage:
-- docker exec -i shuimu-system-pg-test psql -U app -d agent_system_test < scripts/fix-test-env-triage-data.sql
-- Safe to re-run (idempotent where possible).
BEGIN;
-- 1) Retire duplicate project 4 (wanjiahao); keep project 5 (admin + members + assets).
-- Step A: rename project 4 away from the canonical name first (still active).
UPDATE projects
SET name = '全自动冲击波治疗仪 (retired-4)',
updated_at = now()
WHERE id = 4;
-- Step B: retire project 4.
UPDATE projects
SET status = 'demo_retired',
updated_at = now()
WHERE id = 4
AND name = '全自动冲击波治疗仪'
AND COALESCE(status, 'active') <> 'demo_retired';
WHERE id = 4;
-- 2) Fix mis-owned member sessions created by creator upsert (owner was forced to admin).
UPDATE chat_sessions
SET user_id = 32,
-- Step C: restore project 5 canonical name.
UPDATE projects
SET name = '全自动冲击波治疗仪',
updated_at = now()
WHERE session_id = 'sess-p5-u32'
AND project_id = 5
AND user_id = 4;
WHERE id = 5;
UPDATE chat_sessions
SET user_id = 33,
updated_at = now()
WHERE session_id = 'sess-p5-u33'
AND project_id = 5
AND user_id = 4;
-- Step D: fix session owners.
UPDATE chat_sessions SET user_id = 32, updated_at = now()
WHERE session_id = 'sess-p5-u32' AND project_id = 5 AND user_id = 4;
UPDATE chat_sessions SET user_id = 33, updated_at = now()
WHERE session_id = 'sess-p5-u33' AND project_id = 5 AND user_id = 4;
-- 3) Ensure chenwei (35) private session on project 5.
INSERT INTO chat_sessions (session_id, user_id, project_id, title, created_at, updated_at)
SELECT 'sess-p5-u35', 35, 5, '全自动冲击波治疗仪', now(), now()
WHERE EXISTS (
SELECT 1 FROM project_members
WHERE project_id = 5 AND user_id = 35 AND status = 'active'
)
VALUES ('sess-p5-u35', 35, 5, '全自动冲击波治疗仪', now(), now())
ON CONFLICT (session_id) DO UPDATE SET
user_id = EXCLUDED.user_id,
project_id = EXCLUDED.project_id,
@@ -43,6 +35,5 @@ ON CONFLICT (session_id) DO UPDATE SET
COMMIT;
-- Verification queries (run after):
-- SELECT id, name, creator_user_id, status FROM projects WHERE name LIKE '%冲击波%' OR id IN (4,5);
-- SELECT session_id, user_id, project_id FROM chat_sessions WHERE project_id = 5 ORDER BY session_id;
SELECT id, name, creator_user_id, status FROM projects WHERE id IN (4,5) ORDER BY id;
SELECT session_id, user_id, project_id FROM chat_sessions WHERE project_id=5 ORDER BY session_id;