PG 宿主 100.64.0.8 恢复在线→查出旧 jar(Jun-19 00:59)缺 GET bindings 端点(commit 3a7a72f Jun-19 13:30)致 405→rebuild Jun-20 新 jar(反假绿:不用过时 jar)→起栈 48080(local,infra,清 socks)→playwright MSW-off 真打:22 passed/0 failed/0 skipped/0 flaky(9.1s)。 覆盖:accept-suggestion 正负×2 + account-security-ack + agent-create + knowledge-bindings(06-19 PG 离线阻塞项 unblock) + knowledge-confirm + knowledge-graph + live-read×6 + market-publish×8 + workspace。 种子:核验 4/5 基础数据在,knowledge-bindings 投影固化进 e2e/global-setup.ts #6(可入库、下次自动补,补此前未覆盖项);0 红故无就地修。回写进度总账 §五C + 总览待办(受阻→完成) + spec 注释。附本会话 ce-brainstorm/ce-plan 产出文档。 诚实边界:本地全栈活体(rebuild jar + 真 PG muse_slice_live),非 CI(maven.yml 不跑 e2e/需活体后端+浏览器)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
113 lines
10 KiB
Markdown
113 lines
10 KiB
Markdown
# test: 全量 e2e 真跑通 + 测试结论台账
|
||
|
||
- 日期:2026-06-20
|
||
- 类型:test(验证)
|
||
- 深度:Standard
|
||
- Origin:[`docs/brainstorms/2026-06-20-studio-ui端面与e2e真跑通-requirements.md`](../brainstorms/2026-06-20-studio-ui端面与e2e真跑通-requirements.md)
|
||
- Target repo:oh-my-muse(`muse-studio` e2e + `muse-cloud` 后端)
|
||
|
||
---
|
||
|
||
## Summary
|
||
|
||
把 muse-studio 既有 **9 个 playwright e2e spec** 在真实全栈(muse-server 48080 + PG `muse_slice_live` + redis)上**全部真实跑一遍**,消除"待实跑"妥协。配套:基础种子**固化为可入库脚本**(替代一次性 `/tmp/*.java`、补 global-setup 未覆盖项);跑红**就地修**(含后端潜伏 bug,反假绿);最终整理测试结论**回写进度台账**。
|
||
|
||
## Problem Frame
|
||
|
||
接口覆盖门 233/233 只验证后端接口层,≠ 端到端可用。e2e 此前因 PG 宿主 `100.64.0.8:5433` 离线停留在"待实跑"。**2026-06-20 PG 恢复在线**(直连可达、Flyway 24 全绿、165 表),全栈起栈配方现成(`.agents/knowledge/external-deps-and-gotchas.md` §六),本会话已坐实 muse-server READY(`Started in 19.437s`,48080)。
|
||
|
||
最大不确定性有二:① **基础种子完整性**——`global-setup.ts` 每轮自动复位 5 类 fixture,但假定基础数据已存在;基础数据历史靠一次性 `/tmp/*.java`(每会话丢失),knowledge-bindings 投影 global-setup 未覆盖。② **首次全量真跑可能暴露潜伏红**——部分 spec(如 knowledge-bindings)从未活体运行过。
|
||
|
||
## Requirements(trace origin)
|
||
|
||
- **R1**(origin 目标 2):9 个 e2e spec 全部真实跑通(绿)。
|
||
- **R2**(origin 目标 3):测试结论台账——每 spec 状态/证据/修复,回写进度总账。
|
||
- **R3**(origin 完成标准):端到端 e2e 实跑绿,非"待实跑";全栈真实后端 + 真 PG。
|
||
- **R4**(本轮 call-out 决策):基础种子固化为可入库;红用例就地修(含后端)。
|
||
|
||
## Key Technical Decisions
|
||
|
||
1. **基础种子固化为可入库**(global-setup 扩展 / 独立 seed),不再用一次性 `/tmp/*.java`——复利、反每会话丢失,延续 `global-setup.ts` 自身"可入库版替代 /tmp"的既定方向。
|
||
2. **红就地修**(含后端潜伏 bug)——e2e 真绿才算完成,掩盖红=假绿。沿用历史模式(publish 部分索引→V22、confirm 重名 500→预检)。
|
||
3. **起栈用 §六 现成配方**:profile=`local,infra`、清 JVM socks(`-DsocksProxyHost=`)、AI 调度熄火(超大 delay)、`--muse.codegen.import-enable=false`。
|
||
4. **PG = `muse_slice_live`(100.64.0.8:5433)**,凭据走 env(`~/.config/muse-repo/infra.env`),**绝不入库**。
|
||
5. **结论回写进度总账 + 总览**,不新增过程文档(单一台账偏好)。
|
||
|
||
---
|
||
|
||
## Implementation Units
|
||
|
||
### U1. 全栈起栈就绪(前置)
|
||
|
||
- **Goal**:muse-server 单体在 48080 起栈,连 `muse_slice_live` + 本机 redis,AI 调度熄火、socks proxy 清除。
|
||
- **Requirements**:R3。
|
||
- **Dependencies**:无(起点)。
|
||
- **Files**:`.agents/knowledge/external-deps-and-gotchas.md`(§六 配方,参照不改)、`muse-cloud/muse-server/target/muse-server.jar`、`~/.config/muse-repo/infra.env`(仓外凭据)。
|
||
- **Approach**:本机 redis(`--requirepass`)→ `set -a; . infra.env; set +a` → 按 §六 `java -DsocksProxyHost= … -jar muse-server.jar --spring.profiles.active=local,infra --spring.flyway.baseline-on-migrate=true --muse.codegen.import-enable=false`。jar 现为 Jun-19 build(本会话未改后端,可复用);若 U4 改后端则 `mvn -pl muse-server -am package`(classifier=exec 已配)后重起。本会话已起栈 READY,可直接复用。
|
||
- **Test scenarios**:Covers R3. 健康探针 `curl --noproxy '*' -H "Authorization: Bearer test1" -H "tenant-id: 1" -H "X-API-Version: 1" http://localhost:48080/app-api/muse/works?pageNo=1&pageSize=5` → `code:0`;日志含 `Started MuseServerApplication`。
|
||
- **Verification**:48080 健康返回 `code:0`;redis PONG;PG 直连可达。
|
||
|
||
### U2. 基础种子核验 + 固化为可入库脚本
|
||
|
||
- **Goal**:核验 `muse_slice_live` 的 e2e 基础数据完整性,缺失项固化为**可入库基础种子**,补 global-setup 未覆盖的 knowledge-bindings 绑定投影。
|
||
- **Requirements**:R1、R4。
|
||
- **Dependencies**:U1。
|
||
- **Files**:`muse-studio/e2e/global-setup.ts`(扩展基础种子段)或新建 `muse-studio/e2e/seed-base.ts`;参照历史已丢失的 `/tmp/{SeedSec,KnowledgeGraphSeed,SetReqStatus,SeedAppeal,SetAppealSup}.java`(按各 spec 注释 + global-setup 复位逻辑反推语义)。
|
||
- **Approach**:① 连 PG 核验基础数据存在性:`muse_content_block` id=3、`muse_ai_suggestion` id=3、`muse_member_security_event`「待确认演练」、`muse_market_appeal`/资产、账户/智能体、`muse_knowledge_source_binding_projection`(work_id=1/active/market_kb/kb4001)。② 缺失项写**幂等 upsert** 种子(对齐 global-setup 风格)。③ knowledge-bindings 投影种子补入 global-setup 或 seed-base。**注意**:`muse_ai_suggestion.id` 为 `GENERATED ALWAYS`,suggestion3 若缺需处理 id 对齐(global-setup #3 假定其存在不重建)——若无法还原原 id,需调整该 spec 的定位策略或基础种子以稳定 id。
|
||
- **Test scenarios**:种子幂等(重跑不产生重复/唯一冲突);跑后 global-setup 5 类复位**无 "基础种子缺失" warn**;`GET /works/1/knowledge-bindings` 返回 active 绑定。
|
||
- **Verification**:global-setup 跑无 warn;9 spec 的基础前置全部满足。
|
||
|
||
### U3. 逐 spec 实跑 + 结果记录
|
||
|
||
- **Goal**:playwright 跑全部 9 spec,记录每个 pass/fail + 失败根因线索。
|
||
- **Requirements**:R1、R2。
|
||
- **Dependencies**:U1、U2。
|
||
- **Files**:`muse-studio/e2e/{accept-suggestion,knowledge-graph,knowledge-confirm,knowledge-bindings,market-publish,account-security-ack,live-read,agent-create,workspace}.spec.ts`、`muse-studio/playwright.config.ts`(webServer 自动起 vite 5173、`VITE_API_MOCK=false` 已固化)。
|
||
- **Approach**:`set -a; . infra.env; set +a` → `cd muse-studio; ./node_modules/.bin/playwright test`。**先单跑 `knowledge-bindings`**(历史从未活体跑、最高风险,验证 PG unblock)再全量。global-setup 每轮复位 fixture。记录每 spec 结果(绿/红 + trace)。
|
||
- **Test scenarios**:spec 本身即测试。关键断言:accept-suggestion 正/负(采纳写 Canonical rev1→2 / 乐观锁拒);knowledge-confirm(Shadow→Canonical 入库 + 草稿 confirmed);market-publish 6 例(发布草稿/申诉/撤回全链);knowledge-bindings(投影读回 200/code:0/active);live-read 5 读旅程;agent-create / workspace 冒烟。
|
||
- **Verification**:9 spec 结果明确(绿,或红 + 根因);首次全量真跑结果落账。
|
||
|
||
### U4. 红用例就地修(条件性)
|
||
|
||
- **Goal**:跑红的 spec 定位根因(前端断言/接线 or 后端潜伏 bug),**就地修**至绿。
|
||
- **Requirements**:R1、R3、R4。
|
||
- **Dependencies**:U3。
|
||
- **Files**:视红而定——前端 `muse-studio/src/**` 或后端 `muse-cloud/**`(后端改动后回 U1 rebuild jar + 重起栈)。
|
||
- **Approach**:红多为"从未活体跑过的潜伏 bug"。前端红=断言/接线/SSE 漂移类;后端红=潜伏业务 bug(就地修 + 补 Flyway 迁移/IT,如 publish 索引→V22 先例)。
|
||
- **Execution note**:修红前先**复现 + 定位根因**,再 targeted 修,**勿掩盖**(反假绿);后端修须配真实 PG IT 或迁移,不靠放宽断言凑绿。
|
||
- **Test scenarios**:每修复点回归对应 spec 绿;后端修补对应迁移/IT(如适用);修复不引入其他 spec 回归(全量复跑)。
|
||
- **Verification**:原红 spec 转绿,根因 + 修复有记录;全量无回归。
|
||
|
||
### U5. 测试结论台账回写
|
||
|
||
- **Goal**:整理全量 e2e 测试结论(每 spec 状态/证据/修复/无法绿的根因),回写进度总账 + 总览。
|
||
- **Requirements**:R2。
|
||
- **Dependencies**:U3(、U4)。
|
||
- **Files**:`docs/mvp/进度总账.md`、`docs/项目功能与进度总览.md`。
|
||
- **Approach**:结论表(spec × 状态 × 证据 × 修复)。更新总览待办(e2e「待实跑」→ 实跑结果)、必要时同步 `.agents/knowledge/module-reality-baseline.md`。回写进度总账时间线。**不新增过程文档**。
|
||
- **Test scenarios**:none —— 纯文档台账回写,无行为变更。
|
||
- **Verification**:进度台账反映全量 e2e 真实结果;总览 e2e 行从「待实跑」更新为实跑结论。
|
||
|
||
---
|
||
|
||
## Scope Boundaries
|
||
|
||
- **不在本 plan**:studio UI 4 组补全(origin 目标 1)、admin 管理端 UI、两个未实现硬缺口(Meta impact-preview、AI Security 权限链)。
|
||
- **Deferred to Follow-Up Work**:P0 = AI 候选采纳链 UI 补全(见 origin)——本 plan 的全量 e2e 跑通是其前置基线。
|
||
|
||
## Risks & Dependencies
|
||
|
||
- **R-基础数据**:基础种子部分缺失(尤其 suggestion3 `GENERATED ALWAYS` id 难还原)→ U2 核验,可能需调 spec 定位或稳定 id 策略。
|
||
- **R-潜伏红**:首次全量真跑暴露潜伏 bug(knowledge-bindings 从未活体跑)→ U4 就地修,可能触及后端 + rebuild jar。
|
||
- **R-jar 时效**:jar 为 Jun-19 build;U4 改后端须 `mvn package` 重 build + 重起栈(耗时)。
|
||
- **R-fixture 共享**:多 spec 消费共享 fixture(live-read 多读旅程、market 申诉状态流转)→ global-setup 每轮复位缓解,但顺序敏感用例需注意。
|
||
- **R-PG 在线**:`100.64.0.8` 依赖 Tailscale 在线(本会话可达,会话间可能再离线)→ 离线即全套阻塞,需 PG 宿主恢复。
|
||
- **依赖**:本机 redis、`muse-server.jar`、playwright chromium(已装)、`infra.env` 凭据(仓外)。
|
||
|
||
## 完成条件(Verification)
|
||
|
||
1. 9 个 e2e spec **全绿**,或**诚实记录**无法绿的 spec + 根因(反假绿,不放宽断言凑绿)。
|
||
2. 基础种子**可入库、幂等**,global-setup 无"基础种子缺失"warn。
|
||
3. 红用例根因 + 修复有记录;后端修配真实 IT/迁移。
|
||
4. 测试结论**回写进度总账 + 总览**,e2e 行从「待实跑」更新为实跑结论。
|