@tea-agent/loop-agent 0.39.0-next.30 → 0.39.0-next.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -0
- package/dist/build-stamp.json +2 -2
- package/dist/executors/pi-playwright-cli-tool.js +43 -11
- package/dist/shared/playwright-cli-command-policy.js +15 -0
- package/dist/task/source-prepare/parse-intent.js +24 -4
- package/dist/worker/console/dag-execution-receipt.js +33 -0
- package/dist/worker/console/operator-user-error.js +1 -1
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-CiGOV5eG.js → abnfDiagram-N423BO3Z-gauhD9kD.js} +1 -1
- package/dist/worker/console/static/assets/{arc-Ds9Gyfd8.js → arc-pm3c2Rsl.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-C6V6uC98.js → architectureDiagram-T3A2C74G-D_JAg3wH.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-DezF7Ol9.js → blockDiagram-VBNYF7ZC-Dk7-ex52.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BCWk3gCT.js → c4Diagram-5PPSVZJV-Uval9oRI.js} +1 -1
- package/dist/worker/console/static/assets/channel-CVrnUdZl.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-DbYr-Cxy.js → chunk-2GRJ4B5K-BSYjHs-v.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-XSlusW4G.js → chunk-2Q5K7J3B-KGUuBXI8.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-BtcKAj9i.js → chunk-5RXB4S5H-JqAtxD9N.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-BF57lhXj.js → chunk-5VM5RSS4-D6EJOVQK.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DJIlR25o.js → chunk-6Q2QTUOP-B1JriSjm.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-DklNc7dm.js → chunk-GF5L2VYU-D62b96Jd.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-fZNtEdQZ.js → chunk-JWPE2WC7-BsNKEC_r.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-BBgLqV4h.js → chunk-KBJHAD2P-B56v6-ZP.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-Dl9e5n_J.js → chunk-RYQCIY6F-D2KPnd8K.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-B0JK51NT.js → chunk-XXDRQBXY-kzKSCaaL.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-aX91WTya.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-aX91WTya.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-Ch-ajv4O.js → cose-bilkent-JH36ORCC-C6N6KNJd.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-xn_NxcfB.js → cynefin-VYW2F7L2-DiyymT2D.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-DRD0fyga.js → cynefinDiagram-MW4NZA55-BeKAXvf3.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-COtnKp4B.js → dagre-VZM6K2ZE-TkIdXfPF.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-BQp_CAqG.js → diagram-7IWD3JNH-BFmSG3ks.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-x0y-vNgq.js → diagram-B4RE2ZJO-DqpJT2Fs.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-N2ezwL31.js → diagram-LBJQPF4R-r5ATN43t.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-CSaxRH6Q.js → diagram-Q27KOJAE-DEcSCMuR.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-6Ro7Kpbd.js → diagram-UB23O5K3-VOvYRLVc.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-CrIIQEAI.js → ebnfDiagram-BXEA7PRR-D7f4Cb1u.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DivKcq8g.js → erDiagram-JOGREHBK-ziUf3U0G.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-BXrfDo8y.js → flowDiagram-UKHOOZJN-BoRdQ-1y.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-LTTQmMRJ.js → ganttDiagram-PKOTCBZU-B1-GncNm.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-DP3o_5qd.js → gitGraphDiagram-DS77QQ5N-CTW-ph8W.js} +1 -1
- package/dist/worker/console/static/assets/{index-C2jmYBfu.js → index-DEbyrEfW.js} +2 -2
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-wVfSY1WH.js → infoDiagram-6WML65LV-BFA337tZ.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-BRKfFL0I.js → ishikawaDiagram-WSZJBQD7-BtEujgRR.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-DEml3jLb.js → journeyDiagram-NVQOT4AX-C8ZwD2Jp.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-DTzBmOqN.js → kanban-definition-27J2QSJJ-Ck-z8B11.js} +1 -1
- package/dist/worker/console/static/assets/{linear-Cpy1d873.js → linear-CAyXjQjN.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-C1cSavOy.js → mermaid.core-CcWKn6tS.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-BEBSKvYM.js → mindmap-definition-FAOFIHXS-C2NuDO7E.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-BrLs4Oac.js → pegDiagram-VL7TDLO6-BFub3PDz.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-B47AZcLa.js → pieDiagram-7S7Q4E2Y-BJx5THZ5.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-s0dVeYR2.js → quadrantDiagram-CIZ2JOQS-DhalkDWV.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-lW8aJ7Q6.js → railroadDiagram-AXF67PYL-CVcBM36o.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-BcHJPf6Q.js → requirementDiagram-LRYGKXZP-D_vy4n0w.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-DdegpUUf.js → sankeyDiagram-W5VNT64P-DGYdJL1D.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-BxFWqNv8.js → sequenceDiagram-SI44F4Z6-C1xJFg3k.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-cOdUDPbR.js → sizeCapture-X5ZJPWSS-D_Fc43df.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-DpxlYl8P.js → stateDiagram-OKZ733FA-BhGbIjbu.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DUt1lyFL.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-DQOfurE0.js → swimlanes-SLNWSIFB-DVkNcO-V.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BM6SGr7j.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CIp3tC6V.js → timeline-definition-Z64GVDOM-BQU9ufV0.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-C-adIPKn.js → vennDiagram-T6HMQDX7-BCQhRmYB.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-CiYrar9M.js → wardleyDiagram-T6FBY63Y-DWerOyHO.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-WHrdTV0-.js → xychartDiagram-ELKLHX3M-DxLeebQU.js} +1 -1
- package/dist/worker/console/static/index.html +1 -1
- package/dist/worker/loop-agent/loop-agent-client.js +7 -3
- package/dist/worker/observe/static/views/failures.js +5 -2
- package/dist/workflows/dag/frontend-repair.js +14 -0
- package/dist/workflows/dag/frontend-risk.js +15 -2
- package/dist/workflows/dag/frontend-test-case-checklist.js +26 -2
- package/dist/workflows/dag/frontend-test-case-manifest.js +5 -0
- package/dist/workflows/dag/frontend-test-result-contract.js +151 -11
- package/dist/workflows/dag/frontend-verification-trace.js +29 -4
- package/dist/workflows/dag/init-hybrid.js +90 -14
- package/harness.json +2 -2
- package/package.json +1 -1
- package/skills/fe-test-ui-scout/SKILL.md +65 -0
- package/skills/fe-test-ui-scout/references/ledger-schema.md +62 -0
- package/skills/fe-test-ui-scout/references/recon-protocol.md +54 -0
- package/skills/playwright-cli/SKILL.md +22 -0
- package/skills/playwright-cli-case-generator/SKILL.md +20 -1
- package/dist/worker/console/static/assets/channel-DMvu1nmi.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-DVzM-02m.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-DVzM-02m.js +0 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BwecGAkM.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-D5WW_LbN.js +0 -8
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# 台账(ui-anchors.md)表结构与分节规则
|
|
2
|
+
|
|
3
|
+
## 文件位置与命名
|
|
4
|
+
|
|
5
|
+
- 路径:`testcase/frontend/rag/ui-anchors.md`
|
|
6
|
+
- 编码:UTF-8,LF;表格用 GitHub Flavored Markdown。
|
|
7
|
+
- 台账是**增量账本**:修订不删除历史行;失效行改状态列并注明原因。
|
|
8
|
+
|
|
9
|
+
## 顶层结构
|
|
10
|
+
|
|
11
|
+
```markdown
|
|
12
|
+
# UI 锚点台账(frontend-test)
|
|
13
|
+
|
|
14
|
+
- baseUrl:<验证时的绝对 URL>
|
|
15
|
+
- 更新时间:<YYYY-MM-DD HH:mm(本地时区)>
|
|
16
|
+
- 维护:fe-test-ui-scout skill
|
|
17
|
+
|
|
18
|
+
## <页面路由> · <状态>
|
|
19
|
+
|
|
20
|
+
| 字面(find 原文) | 命中 | 唯一 | 控件/位置 | 状态 | 备注 | 验证时间 |
|
|
21
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
22
|
+
| 后端研发(默认 DAG) | 1 | 是 | workflow-kind-select option | 有效 | 括号必须带全 | 2026-08-22 15:00 |
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 分节规则
|
|
26
|
+
|
|
27
|
+
- 一节 = 一个「页面路由 × 状态」组合。路由用 hash 形式(`#/tasks`、
|
|
28
|
+
`#/chat`、`/inspect/#/dags`);状态至少区分:
|
|
29
|
+
- `no-session`(无会话 landing)
|
|
30
|
+
- `has-session`(已存在会话,composer 可见)
|
|
31
|
+
- `empty-session`(新建空会话,无消息)
|
|
32
|
+
- 页面特有态(如 `#/night · 无计划`、`#/recovery · 无候选`、
|
|
33
|
+
setup-required)随需追加,节名写清楚。
|
|
34
|
+
- 同一页面多个状态各自成节;不要把跨状态结果合并进一行。
|
|
35
|
+
|
|
36
|
+
## 列语义
|
|
37
|
+
|
|
38
|
+
| 列 | 说明 |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| 字面(find 原文) | `playwright-cli find "<字面>"` 的唯一入参原文,逐字节照抄(含括号、空格、中点) |
|
|
41
|
+
| 命中 | 侦察时 `find` 实际返回的匹配数(0/1/N) |
|
|
42
|
+
| 唯一 | 是/否/不适用;命中=1 且作用于目标控件才算「是」 |
|
|
43
|
+
| 控件/位置 | 命中元素的角色与位置(如 `h2`、`oc-suggestion strong`、`aria-label`) |
|
|
44
|
+
| 状态 | `有效` / `失效` / `待复核`;失效须在备注注明原因与替代字面 |
|
|
45
|
+
| 备注 | 陷阱与前置:拆节点(kbd+span、text+code)、同名多控件、aria-label≠可见文本、状态前置、setup 门 |
|
|
46
|
+
| 验证时间 | YYYY-MM-DD HH:mm |
|
|
47
|
+
|
|
48
|
+
## 有效 / 失效判定
|
|
49
|
+
|
|
50
|
+
- **有效**:命中=1、目标控件、字面在当前 build 下可复现。
|
|
51
|
+
- **不可断言**:命中 0(字面不存在或被拆节点)、命中 >1 且状态/作用域
|
|
52
|
+
无法区分(如「发送」同时命中 tips 与按钮)。这类行保留在台账里,
|
|
53
|
+
状态列写 `不可断言`,备注写原因——它们正是 PRD 的「禁用清单」。
|
|
54
|
+
- **失效**:页面改版后不再命中。不删行,改状态 + 备注(替代字面是什么)。
|
|
55
|
+
|
|
56
|
+
## 与 PRD / 目录的关系
|
|
57
|
+
|
|
58
|
+
- PRD 每条 `find "..."` 断言的字面必须出自台账某行且该行状态为
|
|
59
|
+
`有效`(或备注给出拆节点断言替代方案,如 `find "taskKind="` 与
|
|
60
|
+
`find "frontend-test"` 二选一)。
|
|
61
|
+
- 目录 AC 的 live 校准注记引用台账行(日期 + 路由+状态),保持
|
|
62
|
+
「AC ↔ 台账」双向可追溯。
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# 逐状态侦察操作协议与陷阱清单
|
|
2
|
+
|
|
3
|
+
## 前置检查
|
|
4
|
+
|
|
5
|
+
1. 确认 SUT 健康:`curl -s -o /dev/null -w '%{http_code}' <baseUrl>/api/health`
|
|
6
|
+
返回 200;非 200 先解决环境,不侦察。
|
|
7
|
+
2. 确认 SUT 跑的是当前 build(改过 `src/**` 后必须 `npm run build` 并重启
|
|
8
|
+
SUT,否则台账记录的是旧页面)。
|
|
9
|
+
3. 准备隔离 app-data(SUT 启动参数已带 `/tmp` 隔离目录时无需额外动作);
|
|
10
|
+
侦察结束把 no-session 状态还原(关闭页面即可;若点了「新建空白对话」
|
|
11
|
+
产生空会话,记录在案即可,不必清理 app-data)。
|
|
12
|
+
|
|
13
|
+
## 每个页面 × 状态的标准动作序列
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
playwright-cli open --browser=chrome <baseUrl>/#/<route>
|
|
17
|
+
playwright-cli snapshot
|
|
18
|
+
playwright-cli find "<候选字面 1>"
|
|
19
|
+
playwright-cli find "<候选字面 2>"
|
|
20
|
+
...
|
|
21
|
+
playwright-cli close
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- `snapshot` 先行:从 snapshot 里核对候选字面的真实渲染形态(是否拆节点、
|
|
25
|
+
是否 aria-label、是否在折叠组内需先展开)。
|
|
26
|
+
- 每个候选字面必须真实 `find` 一次;snapshot 里「看起来有」不算数。
|
|
27
|
+
- 折叠组(如「工程边界(可选,人类确认)」):先记录折叠态的组标题字面,
|
|
28
|
+
再展开后侦察组内字段;两种形态分两行记。
|
|
29
|
+
- 需要状态夹具的节(has-session):点一次「新建空白对话」CTA 进入;
|
|
30
|
+
这是协议允许的唯一写动作。
|
|
31
|
+
|
|
32
|
+
## 陷阱清单(出现即写进备注列)
|
|
33
|
+
|
|
34
|
+
| 陷阱 | 症状 | 台账记法 |
|
|
35
|
+
| --- | --- | --- |
|
|
36
|
+
| 拆节点 | `find "Enter 发送"` 0 命中;DOM 是 `<kbd>Enter</kbd><span>发送</span>` | 字面行记完整原文 + 命中 0 + 状态 `不可断言`;备注给出替代(`find "发送"` 或 `find "Enter"`)并说明拆法 |
|
|
37
|
+
| text+code 拆分 | `taskKind=frontend-test` 渲染为 `taskKind=` + `<code>frontend-test</code>` | 同上 |
|
|
38
|
+
| 同名多控件 | 「发送」同时命中 tips span 与发送按钮 aria-label | 命中 N>1,唯一=否;备注指明各自位置,PRD 需换更独特字面或限定状态 |
|
|
39
|
+
| 同名多行按钮(列表态) | 「重命名会话」在 3 行会话各自命中 1,全局命中 3;单会话态侦察时命中 1 | 备注标「会话数依赖」;断言法降级为 hover 目标行 → snapshot 解析该行真实 ref(存在即通过),禁止声明 find 命中数=1;或确保夹具为单行态(清 app-data) |
|
|
40
|
+
| aria-label ≠ 可见文本 | 控件可访问名是 aria-label,渲染文本不同 | 字面列记 aria-label 值,备注「aria-label;可见文本为 X」 |
|
|
41
|
+
| 无名 flex 子项 | flex 匿名文本无 name-from-content,find 不到 | 记录控件缺 aria-label → 这是**产品可修问题**,报告给修复决策树(页面象限),台账暂记 `不可断言` |
|
|
42
|
+
| 括号/全半角 | 「后端研发(默认 DAG)」少括号 0 命中 | 字面逐字节照抄;备注提醒 |
|
|
43
|
+
| 状态前置 | 控件只在 has-session / setup-required 等状态下存在 | 分节记录;PRD 引用时必须声明状态夹具 |
|
|
44
|
+
| 折叠组 | 字面在 `<details>` 内,未展开时 find 0 | 两种形态分行记录(折叠标题/展开后字段) |
|
|
45
|
+
| 瞬态文案 | 「正在加载…」类短暂存在 | 备注标「瞬态」,PRD 不引用 |
|
|
46
|
+
|
|
47
|
+
## 输出纪律
|
|
48
|
+
|
|
49
|
+
- find 命中数以工具返回为准,不目测。
|
|
50
|
+
- 每节侦察完立即写台账(不攒到最后凭记忆写)。
|
|
51
|
+
- 侦察小结按 SKILL.md 第 5 步输出:新增/修订/失效行数、命中率、
|
|
52
|
+
PRD 可用锚点清单与禁用清单。
|
|
53
|
+
- 发现疑似产品缺陷(白屏、文案缺失、aria 错误):记入小结的「移交修复」
|
|
54
|
+
段,不在台账内修,不因缺陷跳过其余候选字面的侦察。
|
|
@@ -25,6 +25,7 @@ close
|
|
|
25
25
|
goto
|
|
26
26
|
snapshot
|
|
27
27
|
find
|
|
28
|
+
find-unique
|
|
28
29
|
click
|
|
29
30
|
dblclick
|
|
30
31
|
fill
|
|
@@ -71,6 +72,16 @@ playwright-cli close
|
|
|
71
72
|
普通交互和控制台输出均不能单独取得 passed authority。通过的 case 还需要同一 child 的有序
|
|
72
73
|
controller receipts:successful `open` → successful `find` → successful post-execution cleanup。
|
|
73
74
|
|
|
75
|
+
### 唯一性断言优先用 find-unique
|
|
76
|
+
|
|
77
|
+
当语义要求「全页恰好一个」时,用 `playwright-cli find-unique "字面"` 代替人工数命中数:它内部
|
|
78
|
+
执行 find 并在解析命中数 ≠ 1 时以非零退出码失败(零命中/多命中/输出不可解析均 fail),错误
|
|
79
|
+
信息直接给出 `expected exactly 1 match, got N`。它只接受一个文本字面量、不接受 `--regex` 等
|
|
80
|
+
flag。台账中标注 `==1` 的锚点、以及「唯一命中」类 AC 应优先用它;`>=N` 存在性断言仍用
|
|
81
|
+
`find`(find-unique 会拒绝多命中)。controller 会解析两类命令的命中数写入 receipt,finalize
|
|
82
|
+
时用 case 文档声明的 `find "字面" >=N / ==N` 对照 receipt 复核,缺失或不满足会把 passed
|
|
83
|
+
降级为 blocked(assertion-not-receipt-backed),因此声明的断言必须真的执行。
|
|
84
|
+
|
|
74
85
|
## 受限证据采集
|
|
75
86
|
|
|
76
87
|
- UI 状态:先 `snapshot`,完成交互后以成功 `find` 证明用户可见结果。
|
|
@@ -91,3 +102,14 @@ controller receipts:successful `open` → successful `find` → successful pos
|
|
|
91
102
|
当环境、数据、权限、时序、异常路径或响应内容无法用 RAG、已验证 context URL 和 runtime allowlist 证明时,
|
|
92
103
|
写入 `blocked` evidence,并提供具体 `blockedReason`。不要引入替代执行路径,也不要把隐藏状态或
|
|
93
104
|
未观察到的网络结果当作通过证据。
|
|
105
|
+
|
|
106
|
+
### 唯一控件早停(unique-control-unavailable)
|
|
107
|
+
|
|
108
|
+
- 适用:AC 点名的具体控件在到达目标状态后的**首个 post-navigation snapshot** 中缺失,且页面没有
|
|
109
|
+
setup-required 门(如「需先完成 Pi setup」)。
|
|
110
|
+
- 判定:用 case 给出的字面做**单次** `find`;返回 0 命中即为充分证据,直接写
|
|
111
|
+
`status=blocked`、`blockedReason=unique-control-unavailable`,在 execution.md 中引用该次 find 结果。
|
|
112
|
+
- 禁止:换字面重试、反复 snapshot、绕路导航、多轮探索或请求 rerun。这些都产生无放大的 token
|
|
113
|
+
成本且不改变结论(Wave 3 教训:反复探测不存在控件耗掉约 717k input tokens)。
|
|
114
|
+
- 若 snapshot 显示存在 setup-required 门或状态前置未满足,按其对应 blockedReason 记录
|
|
115
|
+
(环境/状态类),不属于本早停。
|
|
@@ -14,11 +14,21 @@ description: 根据 FE-test RAG 知识包生成可由受限 playwright_cli runti
|
|
|
14
14
|
## 输入与边界
|
|
15
15
|
|
|
16
16
|
- 只读取 `testcase/frontend/rag/context.md`、`coverage-map.md` 与已有 `testcase/frontend/cases/`。
|
|
17
|
+
- 若存在 `testcase/frontend/rag/ui-anchors.md` 锚点台账,必须一并读取并作为 UI 断言的唯一事实源;台账缺失时按 RAG 知识包生成,但不得引用台账外的具体控件字面(缺失信息标 `blocked`)。
|
|
17
18
|
- 只写 `testcase/frontend/cases/**`;不得回读 PRD、读取 `.harness/`,或写
|
|
18
19
|
`testcase/frontend/evidence/**`。
|
|
19
20
|
- 所有 API、字段限制、状态流转、数据来源、SLA、URL 与账号要求必须能在 RAG 知识包中追溯。
|
|
20
21
|
缺失信息标记 `blocked` 或“需人工确认”,不得猜测。
|
|
21
22
|
|
|
23
|
+
### 锚点台账规则(存在 ui-anchors.md 时)
|
|
24
|
+
|
|
25
|
+
- case 中每条拟通过的 `find "<字面>"` 断言必须能在台账对应「页面 × 状态」节找到
|
|
26
|
+
状态为 `有效` 的行;台账 `不可断言` / `失效` 行的字面**禁止**作为通过断言。
|
|
27
|
+
- AC 点名的控件在台账对应状态节缺失(0 命中或无行)时,该 AC 的 case 生成
|
|
28
|
+
`blocked` 语义说明(或从本批剔除该 AC),`blockedReason` 用
|
|
29
|
+
`unique-control-unavailable`,不得生成探测性步骤反复 find。
|
|
30
|
+
- 台账行备注中的替代断言方案(如拆节点后的短字面二选一)按备注执行。
|
|
31
|
+
|
|
22
32
|
## 输出
|
|
23
33
|
|
|
24
34
|
- 写 `index.md`、`manifest.draft.json`(生成阶段;materialize 会写成 `manifest.json`)与独立 case 文件
|
|
@@ -51,7 +61,16 @@ description: 根据 FE-test RAG 知识包生成可由受限 playwright_cli runti
|
|
|
51
61
|
占位符仅表示从紧邻其前、最新一次 `snapshot` 输出解析出的真实 `eNN` ref。生成的 case 必须在每次
|
|
52
62
|
引用元素前写明 fresh snapshot;`eX`/`eY` 不是可传给 structured tool 的 literal ref,新的 snapshot
|
|
53
63
|
会使旧 ref 失效,不得复用 stale ref。
|
|
54
|
-
5.
|
|
64
|
+
5. **期望命中数不得内联进命令行(硬约束)**:如需声明 find 期望命中数,写在「预期结果」区或
|
|
65
|
+
列表项的说明文字中(如 “预期唯一命中”);命令行只写纯命令 `playwright-cli find "<字面>"`。
|
|
66
|
+
禁止 `find "<字面>">=N`、`≥N`、`(≥N)` 等计数后缀内联进命令 token。
|
|
67
|
+
6. **唯一性断言优先 find-unique**:台账或 AC 标注 `==1`/「唯一命中」的锚点,生成
|
|
68
|
+
`playwright-cli find-unique "<字面>"`(仅一个文本字面量,无 flag;多命中/零命中即命令失败);
|
|
69
|
+
`>=N` 存在性断言仍用 `find`。finalize 会用 case 文档中 `find "字面" >=N / ==N` 声明对照
|
|
70
|
+
controller receipt 的解析命中数复核,声明的断言未真正执行或命中数不满足会把 passed 降级为
|
|
71
|
+
blocked(assertion-not-receipt-backed)——因此「测试点」里声明的每个 find 断言都必须在步骤中
|
|
72
|
+
真实执行且字面完全一致。
|
|
73
|
+
7. 明确的 UI/API 预期与数据清理结果;无法满足的环境或数据依赖必须写为 `blocked`。
|
|
55
74
|
|
|
56
75
|
所有文件型输出均由 controller 绑定到执行节点提供的
|
|
57
76
|
`testcase/frontend/evidence/<case-id>/` 工作目录。截图一律使用 canonical 语法
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ag as o,ah as n}from"./mermaid.core-C1cSavOy.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-GF5L2VYU-DklNc7dm.js";import{_ as i}from"./mermaid.core-C1cSavOy.js";import"./chunk-5VM5RSS4-BF57lhXj.js";import"./chunk-XXDRQBXY-B0JK51NT.js";import"./chunk-KBJHAD2P-BBgLqV4h.js";import"./chunk-2GRJ4B5K-DbYr-Cxy.js";import"./index-C2jmYBfu.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-GF5L2VYU-DklNc7dm.js";import{_ as i}from"./mermaid.core-C1cSavOy.js";import"./chunk-5VM5RSS4-BF57lhXj.js";import"./chunk-XXDRQBXY-B0JK51NT.js";import"./chunk-KBJHAD2P-BBgLqV4h.js";import"./chunk-2GRJ4B5K-DbYr-Cxy.js";import"./index-C2jmYBfu.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as r,b as e,a,S as s}from"./chunk-5RXB4S5H-BtcKAj9i.js";import{_ as i}from"./mermaid.core-C1cSavOy.js";import"./chunk-XXDRQBXY-B0JK51NT.js";import"./chunk-KBJHAD2P-BBgLqV4h.js";import"./chunk-2GRJ4B5K-DbYr-Cxy.js";import"./index-C2jmYBfu.js";var u={parser:a,get db(){return new s(2)},renderer:e,styles:r,init:i(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{u as diagram};
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import{c as r,s as e}from"./flowDiagram-UKHOOZJN-BXrfDo8y.js";import{_ as a}from"./mermaid.core-C1cSavOy.js";import"./chunk-5VM5RSS4-BF57lhXj.js";import"./chunk-XXDRQBXY-B0JK51NT.js";import"./chunk-KBJHAD2P-BBgLqV4h.js";import"./chunk-2GRJ4B5K-DbYr-Cxy.js";import"./channel-DMvu1nmi.js";import"./index-C2jmYBfu.js";var o=a(t=>`${e(t)}
|
|
2
|
-
.swimlane.cluster rect {
|
|
3
|
-
stroke: ${t.clusterBorder} !important;
|
|
4
|
-
}
|
|
5
|
-
[data-look="neo"].cluster rect {
|
|
6
|
-
filter: none;
|
|
7
|
-
}
|
|
8
|
-
`,"getStyles"),s=o,n=r({defaultLayout:"swimlane",styles:s});export{n as diagram};
|