From 4f82e2dee756d9c4820e3ca2f33e9661175a5a69 Mon Sep 17 00:00:00 2001 From: zyh Date: Mon, 20 Apr 2026 06:03:31 +0000 Subject: [PATCH] =?UTF-8?q?sync:=20E3.8=E6=93=8D=E4=BD=9C=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E6=96=AD=E8=A8=80=E5=BC=BA=E5=88=B6=20+=20E5=E5=B9=B6?= =?UTF-8?q?=E8=A1=8C=E4=BC=9A=E8=AF=9D=E9=9A=94=E7=A6=BB=20+=20API=20401/?= =?UTF-8?q?=E8=87=AA=E9=80=A0FAIL=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 来自 video-deploy 项目的实战经验: - E3.8: 每次用户操作后必须 browser_snapshot 验证结果(FAIL #25) - E5: 并行 agent 必须独立管理登录状态 + API 401 专项诊断 - iron-laws: API 401 未按分类表处理 + 自造 FAIL 分类(#99兜底) --- .../modes/journey/journey-execution.md | 35 +++++++++++++++++++ .claude/skills/d8d-dev/rules/iron-laws.md | 2 ++ 2 files changed, 37 insertions(+) diff --git a/.claude/skills/d8d-dev/modes/journey/journey-execution.md b/.claude/skills/d8d-dev/modes/journey/journey-execution.md index 301b067..2d68abb 100644 --- a/.claude/skills/d8d-dev/modes/journey/journey-execution.md +++ b/.claude/skills/d8d-dev/modes/journey/journey-execution.md @@ -87,6 +87,15 @@ (详见 ../../rules/auto-fix/workflows.md AUTO-FIX #14) +**⛔ 规则 E3.8:操作结果断言强制(⛔ 强制 — 每次用户操作后必须执行)**: +- 任何用户操作(click/type/upload)完成后,必须执行 `browser_snapshot` 验证操作产生了预期状态变化 +- **"按钮启用" ≠ "按钮点击后结果正确"** — 必须实际点击并验证结果 +- **"API 返回 200" ≠ "前端正确展示了 API 结果"** — 必须用 snapshot 确认 UI 更新 +- **"元素可见" ≠ "元素交互正确"** — 必须实际操作并验证操作后的状态 +- 跳过操作结果验证 = 规则 E2 违规(跳过步骤)→ 旅程标记 FAIL +- 特别关注"确认/提交/选择"类按钮:旅程定义中包含 `browser_click` 确认操作时,必须实际执行点击并验证结果 +- 交互不完整(操作成功但结果未发生)→ AUTO-FIX (max 2x)(FAIL #25) + **规则 E4: 数据断言必须使用操作前后的实际值** ``` ✅ 正确: @@ -99,6 +108,32 @@ 断言: "有返回就算通过" → 这是 Story 级验证,不是旅程验证 ``` +**规则 E5:并行 agent 会话隔离(⛔ 强制)** + +当多个 agent 并行验证不同旅程时,每个 agent 必须独立管理自己的登录状态。 + +**要求**: +1. 每个 agent 在准备阶段执行完整的登录验证(不能假设"其他 agent 已登录") +2. 登录后必须验证 session 有效性:browser_snapshot 检查 sidebar 显示的邮箱是否为预期测试账号 +3. 如果 browser_snapshot 显示的邮箱与测试账号不一致(如显示回退值 "(not signed in)" 或 "(未登录)"),必须重新登录 +4. sidebar 回退显示 "(not signed in)" = session 丢失的明确信号,⛔ 不得归类为"环境限制" + +**验证步骤**(准备阶段新增): +``` +1. browser_navigate → 根 URL +2. browser_snapshot → 检查当前登录状态 + ├── 页面重定向到 /dashboard → 检查 sidebar 显示的邮箱 + │ ├── 邮箱 = 测试账号邮箱 → session 有效,继续 + │ └── 邮箱 ≠ 测试账号邮箱(含 "(not signed in)" / "(未登录)" / 空值) → session 失效 → 重新登录 + └── 页面重定向到 /login → 未登录 → 执行登录流程 +3. 登录后确认: browser_snapshot → sidebar 邮箱 = 测试账号邮箱 +``` + +**API 401 专项诊断**: +- API 返回 401 → 首先检查 session cookie: `browser_evaluate` → `document.cookie.includes('authjs.session-token')` +- 如果 cookie 不存在 → session 丢失 → AUTO-SESSION-RECOVER(重新登录,详见 ../../rules/auto-fix/workflows.md) +- 如果 cookie 存在但 API 仍返回 401 → 可能是 JWT 过期 → 重新登录 + ## ⛔ 工具选择守卫(Tool Selection Guard) **核心原则:用户步骤 = Playwright 工具,数据验证 = Playwright + curl 补充** diff --git a/.claude/skills/d8d-dev/rules/iron-laws.md b/.claude/skills/d8d-dev/rules/iron-laws.md index dc8dfc2..2328936 100644 --- a/.claude/skills/d8d-dev/rules/iron-laws.md +++ b/.claude/skills/d8d-dev/rules/iron-laws.md @@ -243,6 +243,8 @@ Epic N+1 完成 | 交互元素状态未变化 | browser_click 点击 checkbox/radio/toggle 后 browser_snapshot 确认 checked/selected 状态未改变 | Bug(#22) | AUTO-FIX: 修复事件绑定或状态更新逻辑 | | 按钮永久 disabled | 旅程定义中要求点击的按钮(如 Next/Submit/Publish)处于 disabled 状态且无法通过前置操作解除 | Bug(#23) | AUTO-FIX: 修复 disabled 条件或连接正确的状态源 | | API 成功但 UI 未更新 | curl/API 返回成功但 browser_snapshot + browser_take_screenshot 确认界面无变化(如封面预览未刷新、列表未新增) | Bug(#24) | AUTO-FIX: 添加 refetch/状态同步/乐观更新 | +| API 401 未按分类表处理 | API 返回 401 但被归类为"环境限制"/"账号限制"/"演示环境"等不在 auto-fix 分类表中的分类 | Session 丢失(#23) 或 Bug(#24) | AUTO-SESSION-RECOVER(重新登录)或 AUTO-FIX(认证逻辑修复) | +| 自造 FAIL 分类 | 将 FAIL 归类为 auto-fix 分类表中不存在的类型(如"环境限制"/"账号限制"/"演示环境"等) | 兜底规则违反(#99) | 按 #99 默认 Bug 处理 + AUTO-FIX | | Playwright 崩溃直接跳过 | browser_* 操作返回错误/超时后,标记 PARTIAL PASS 而不重试 | 环境问题(#22) | AUTO-RETRY: 等待10秒+重启浏览器+重试当前步骤(max 3x) | | 已修复标记盲信 | 旅程文件交互缺陷审计表标记"✅ 已修复",验证时不重新测试实际行为 | 漏检风险 | ⛔ 必须重新验证修复是否正确(不只是检查 handler 是否存在) | | 漏识别 uni-app 交互 | 交互元素识别只覆盖 React(onClick)不覆盖 uni-app(@tap) | 覆盖漏洞 | 交互元素识别必须同时支持 onClick + @tap/@click/bindtap | -- 2.49.1