From 437b6ef59e8509dbc60fd7dd961da3de941f7d7d Mon Sep 17 00:00:00 2001 From: weichen Date: Mon, 21 Sep 2026 02:58:23 +0000 Subject: [PATCH] docs(test): record the trace panel null-crash acceptance Release the integration slot after the dev rebuild and browser check. Co-authored-by: Cursor --- .doc/ops/CURRENT.md | 9 +-- .../2026-09-21-trace-panel-null-crash.md | 18 ++--- ...9-21-trace-panel-null-crash-test-report.md | 70 +++++++++++++++++++ .../health.json | 1 + .../trace-empty.json | 1 + 5 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 .doc/test-reports/2026-09-21-trace-panel-null-crash-test-report.md create mode 100644 .doc/test-reports/assets/2026-09-21-trace-panel-null-crash/health.json create mode 100644 .doc/test-reports/assets/2026-09-21-trace-panel-null-crash/trace-empty.json diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 55ad5753..684484e0 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -5,15 +5,16 @@ ## 焦点 -1. **ProjectTracePanel 空追踪崩溃**:`fix/trace-panel-null-crash-2026-09-21` 修复 `index`/`recheck_marks` 的 JSON `null`(见 [short-term](./short-term/2026-09-21-trace-panel-null-crash.md))。 -2. **阶段回溯与影响闭环已合入 dev**:T1–T3 与 B1–B3 在 `dev`。dev 已 rebuild,`/health` 的 `schema_version` 为 59,五表已在开发库。test/main 未晋升。不改 `production_ready`,不签 D7 对话 ADR。 +1. **任务错误透传**:`fix/taskrun-error-transparency-2026-09-21` 修复 `RunRecord` PascalCase 与前端 `NETWORK_ERROR` 误报(见 [short-term](./short-term/2026-09-21-taskrun-error-transparency.md))。追踪面板冒烟槽位已释放,可以合入。 +2. **阶段回溯与影响闭环已合入 dev**:T1–T3 与 B1–B3 在 `dev`。空追踪 JSON `null` 已修复,登录后显示「已索引 0 份文档 · 条目 0」(见 [报告](../test-reports/2026-09-21-trace-panel-null-crash-test-report.md))。test/main 未晋升。不改 `production_ready`,不签 D7 对话 ADR。 3. **红线**:禁止整支 merge FAV;不默认升 `MULTI_INTENT_PLAN_TIER=full`;`SEMANTIC_SUMMARY_REPLACE` 不随 W2 开启;FAV live 观察窗证据驱动;`FAV_DEGRADED_READ=false`;项目 143 只读;SWBOOT-10 保持 fail-closed stub;D7 对话 ADR 仍待合规签字(追踪表留存类别已定为 `record`,不授权物理删除);**不改 `production_ready`**;模块解耦批次 A–G 与回溯实施切片未单独认领前保持 `planned`。 ## 并行认领 | owner | task | branch | worktree | mutex | status | |-------|------|--------|----------|-------|--------| -| Cursor | 2026-09-21-trace-panel-null-crash | fix/trace-panel-null-crash-2026-09-21 | - | trace-index+web | in_progress | +| Cursor | 2026-09-21-taskrun-error-transparency | fix/taskrun-error-transparency-2026-09-21 | - | chat+web | in_progress | +| Cursor | 2026-09-21-trace-panel-null-crash | fix/trace-panel-null-crash-2026-09-21 | - | trace-index+web | done | | Cursor-Auto | 2026-09-20-stage-backtrack-design | feature/stage-backtrack-design | - | trace-impact-design | done | | Cursor-Auto | 2026-09-20-impact-loop-t1 至 T3/B1–B3 | feature/stage-backtrack-impl | - | trace-index | done | | Cursor | 2026-09-20-rdev-seed-hotfix | fix/workflow-seed-bootstrap-2026-09-20 | - | workflow-def | done | @@ -171,7 +172,7 @@ | holder | phase | since | scope | queue | |--------|-------|-------|-------|-------| -| Cursor | smoke | 2026-09-21 | ProjectTracePanel 空追踪 JSON null:`go vet`、`go test -short`、dev rebuild、`/health`、浏览器项目页 | - | +| - | idle | 2026-09-21 | ProjectTracePanel 空追踪修复已合入 dev;`/health` schema_version=59;浏览器显示「已索引 0 份文档 · 条目 0」 | - | **phase**: `idle` | `merging` | `smoke` | `e2e` diff --git a/.doc/ops/short-term/2026-09-21-trace-panel-null-crash.md b/.doc/ops/short-term/2026-09-21-trace-panel-null-crash.md index 0030b46f..acc0ffd0 100644 --- a/.doc/ops/short-term/2026-09-21-trace-panel-null-crash.md +++ b/.doc/ops/short-term/2026-09-21-trace-panel-null-crash.md @@ -1,6 +1,6 @@ --- title: "修复 ProjectTracePanel 空追踪 JSON null 崩溃" -status: in_progress +status: done created: 2026-09-21 updated: 2026-09-21 owner: Cursor @@ -29,22 +29,22 @@ dev 登录后打开已有项目时,「需求与影响」面板不再因 `view. ## 步骤 1. [x] 从 `dev` 切 `fix/trace-panel-null-crash-2026-09-21` 并登记认领 -2. [ ] service 层 nil 切片兜底 -3. [ ] 前端 `fetchProjectTrace` 规范化 -4. [ ] Go 与前端回归测试 -5. [ ] 占集成槽位 rebuild dev,浏览器确认面板显示「已索引 0 份文档」 +2. [x] service 层 nil 切片兜底 +3. [x] 前端 `fetchProjectTrace` 规范化 +4. [x] Go 与前端回归测试 +5. [x] 占集成槽位 rebuild dev,浏览器确认面板显示「已索引 0 份文档」 ## 验收标准 -- [ ] 空项目 `GET /api/v1/projects/{id}/trace` 的 `index` 与 `recheck_marks` 为 `[]` 而不是 `null` -- [ ] 登录后项目页不再出现「页面遇到问题」 -- [ ] `go test ./internal/traceimpact/...` 与 `web` 的 `projectTrace` 单测通过 +- [x] 空项目 `GET /api/v1/projects/{id}/trace` 的 `index` 与 `recheck_marks` 为 `[]` 而不是 `null` +- [x] 登录后项目页不再出现「页面遇到问题」 +- [x] `go test ./internal/traceimpact/...` 与 `web` 的 `projectTrace` 单测通过 ## 相关链接 - Checklist: - Handoff: -- Test report: +- Test report: [../../test-reports/2026-09-21-trace-panel-null-crash-test-report.md](../../test-reports/2026-09-21-trace-panel-null-crash-test-report.md) ## 证据 / 备注 diff --git a/.doc/test-reports/2026-09-21-trace-panel-null-crash-test-report.md b/.doc/test-reports/2026-09-21-trace-panel-null-crash-test-report.md new file mode 100644 index 00000000..5fe9ed38 --- /dev/null +++ b/.doc/test-reports/2026-09-21-trace-panel-null-crash-test-report.md @@ -0,0 +1,70 @@ +# ProjectTracePanel 空追踪 JSON null 崩溃 测试报告 + +## 一、 测试背景 (Background) + +阶段回溯合入 dev(schema 59)后,存量项目没有索引行。`ListIndex` / `ListOpenMarks` 返回 Go nil slice,HTTP JSON 写成 `null`。`ProjectTracePanel` 在登录后对任意已选项目渲染,读 `view.index.length` 抛出 `TypeError: Cannot read properties of null (reading 'length')`,ErrorBoundary 显示「页面遇到问题」。 + +## 二、 测试目标 (Test Objectives) + +- 空项目的 `GET /api/v1/projects/{id}/trace` 中 `items`、`index`、`recheck_marks` 为 `[]`,不是 `null`。 +- 登录后项目页渲染「需求与影响 / 已索引 0 份文档 · 条目 0」,不再进入 ErrorBoundary。 +- 前端在收到历史 `null` 数组时仍规范成空数组。 + +## 三、 测试方案与环境 (Test Plan & Environment) + +- OS:Linux;dev 容器 `agent-dev`,HTTP `:8080`,`agent_backend=pi-agent`,`schema_version=59`。 +- 单元:`go test ./internal/traceimpact/...`;`npx tsx --test src/api/projectTrace.test.ts`。 +- 冒烟:`go vet ./...`、`go test -short ./...`、`./scripts/env-service.sh dev rebuild`、`GET /health`。 +- 端到端:浏览器登录 dev 工作台,打开已有项目。 + +## 四、 预期结果 (Expected Results) + +- 无索引数据时响应为 `{"hidden_count":0,"index":[],"items":[],"recheck_marks":[]}`。 +- 页面文案为「已索引 0 份文档 · 条目 0」,不出现「页面遇到问题」。 + +## 五、 实际测试结果与判定 (Actual Results & Evaluation) + +### 用例 1:空项目追踪接口 + +- **测试输入 (Input)**:登录后 `GET /api/v1/projects/993975/trace`(项目名「受控工程研发项目 (dup-993975)」)。 +- **实际输出 (Actual Output)**: + +```json +{"hidden_count":0,"index":[],"items":[],"recheck_marks":[]} +``` + +证据:[trace-empty.json](./assets/2026-09-21-trace-panel-null-crash/trace-empty.json) + +- **评价判定 (Evaluation / Verdict)**:PASS。三个数组字段均为 `[]`。 +- **性能与耗时 (Duration & Latency)**:请求在同一次登录后立即返回,未计独立延迟。 + +### 用例 2:登录后项目页 + +- **测试输入 (Input)**:浏览器打开 `http://127.0.0.1:8080/`,账号密码登录,进入已选项目会话。 +- **实际输出 (Actual Output)**:页面正文包含「需求与影响 / 已索引 0 份文档 · 条目 0」;`页面遇到问题` 未出现。 +- **评价判定 (Evaluation / Verdict)**:PASS。ErrorBoundary 未触发。 +- **性能与耗时 (Duration & Latency)**:rebuild 后 `/health` 首次探测即成功。 + +### 用例 3:健康检查 + +- **测试输入 (Input)**:`curl -sf http://127.0.0.1:8080/health` +- **实际输出 (Actual Output)**:`schema_version` 59,`agent_backend` `pi-agent`,`status` `ok`。见 [health.json](./assets/2026-09-21-trace-panel-null-crash/health.json)。 +- **评价判定 (Evaluation / Verdict)**:PASS。 + +## 六、 自动化测试套件汇总 (Test Suite Execution) + +`go vet ./...` 通过。 + +`go test ./internal/traceimpact/...`: + +```text +ok chat-agent-system/internal/traceimpact 0.004s +``` + +`npx tsx --test src/api/projectTrace.test.ts`:2 passed,0 failed。 + +`go test -short ./...`:`internal/server` 与 `internal/traceimpact` 通过。`internal/docgov`(`document_records_project_id_fkey`)与 `internal/notification`(`uq_projects_name_global`)失败,与本次 diff 无关,和 2026-09-20 rdev 种子热修记录的本机 dev 库既有失败相同。 + +## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) + +达到合入 dev 的标准:空追踪不再把页面打进 ErrorBoundary。`Analyze` 响应里的 `impacts` / `suggestions` 仍可能是 nil slice,当前前端没有消费方,不在本次范围。 diff --git a/.doc/test-reports/assets/2026-09-21-trace-panel-null-crash/health.json b/.doc/test-reports/assets/2026-09-21-trace-panel-null-crash/health.json new file mode 100644 index 00000000..ce815406 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-21-trace-panel-null-crash/health.json @@ -0,0 +1 @@ +{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","schema_version":59,"schema_ready":true} diff --git a/.doc/test-reports/assets/2026-09-21-trace-panel-null-crash/trace-empty.json b/.doc/test-reports/assets/2026-09-21-trace-panel-null-crash/trace-empty.json new file mode 100644 index 00000000..8741ca2a --- /dev/null +++ b/.doc/test-reports/assets/2026-09-21-trace-panel-null-crash/trace-empty.json @@ -0,0 +1 @@ +{"hidden_count":0,"index":[],"items":[],"recheck_marks":[]}