@tea-agent/loop-agent 0.13.0 → 0.15.0
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/AGENTS.md +157 -157
- package/CHANGELOG.md +116 -305
- package/README.md +357 -334
- package/bin/agent-worker.js +22 -22
- package/bin/loop-agent.js +21 -21
- package/dist/commands/cursor-prompt.js +6 -6
- package/dist/commands/init.js +505 -505
- package/dist/commands/loop-benchmark.js +11 -11
- package/dist/commands/pi-reuse-benchmark.js +16 -16
- package/dist/executors/pi-event-serializer.js +33 -11
- package/dist/sidecars/cursor-prompt/executor.js +1 -1
- package/dist/task/runtime.js +27 -27
- package/dist/worker/observe/spec-evidence.js +19 -10
- package/dist/worker/observe/static/api.js +46 -46
- package/dist/worker/observe/static/app.js +151 -150
- package/dist/worker/observe/static/constants.js +156 -148
- package/dist/worker/observe/static/copy.js +67 -67
- package/dist/worker/observe/static/dag-helpers.js +201 -172
- package/dist/worker/observe/static/dag-layout.d.ts +31 -31
- package/dist/worker/observe/static/dag-layout.js +83 -83
- package/dist/worker/observe/static/dag-model.js +72 -72
- package/dist/worker/observe/static/dom.js +122 -122
- package/dist/worker/observe/static/format-pool.d.ts +71 -0
- package/dist/worker/observe/static/format-pool.js +134 -67
- package/dist/worker/observe/static/format.js +317 -292
- package/dist/worker/observe/static/index.html +350 -308
- package/dist/worker/observe/static/kpi.js +100 -94
- package/dist/worker/observe/static/markdown-render.js +124 -0
- package/dist/worker/observe/static/relations.js +133 -133
- package/dist/worker/observe/static/router.js +93 -93
- package/dist/worker/observe/static/run-processing.js +148 -148
- package/dist/worker/observe/static/shell-chrome.js +74 -68
- package/dist/worker/observe/static/state.js +273 -267
- package/dist/worker/observe/static/styles.css +2504 -1902
- package/dist/worker/observe/static/views/batch.js +227 -227
- package/dist/worker/observe/static/views/dag-graph.js +172 -172
- package/dist/worker/observe/static/views/dag-inspector.js +530 -627
- package/dist/worker/observe/static/views/dag.js +371 -371
- package/dist/worker/observe/static/views/dashboard.js +86 -100
- package/dist/worker/observe/static/views/failures.js +143 -143
- package/dist/worker/observe/static/views/feature.js +492 -492
- package/dist/worker/observe/static/views/pool.js +708 -350
- package/dist/worker/observe/static/views/run.js +453 -453
- package/dist/worker/observe/static/views/session-timeline.js +771 -219
- package/dist/worker/observe/static/views/shell.js +7 -7
- package/dist/worker/observe/static/views/task.js +314 -314
- package/dist/worker/observe/static/views/timeline.js +163 -163
- package/dist/workflows/dag/canvas-observer.js +275 -275
- package/dist/workflows/dag/init-hybrid.js +27 -11
- package/docs/README.md +106 -104
- package/docs/architecture/README.md +26 -26
- package/docs/architecture/dag-execution.md +140 -140
- package/docs/architecture/evolution.md +54 -54
- package/docs/architecture/facts-and-state.md +71 -71
- package/docs/architecture/runtime-boundaries.md +191 -191
- package/docs/architecture/system-overview.md +93 -93
- package/docs/architecture/worker-and-feature.md +85 -85
- package/docs/harness-methodology-debugging.md +153 -153
- package/docs/harness-methodology-tdd.md +130 -130
- package/docs/harness-methodology-verification.md +27 -27
- package/docs/init-surface.manifest.json +304 -307
- package/docs/skills/README.md +7 -7
- package/docs/skills/vetted-skill-registry.md +29 -29
- package/docs/templates/adr.md +60 -60
- package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -94
- package/docs/templates/agent-dag-decision-envelope.schema.json +213 -213
- package/docs/templates/agent-dag-decision-gate-dogfood-report.md +117 -117
- package/docs/templates/agent-dag-decision-gate.prompt.md +246 -246
- package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -98
- package/docs/templates/agent-dag-report.schema.json +473 -473
- package/docs/templates/agent-dag-review-verdict.prompt.md +68 -68
- package/docs/templates/agent-dag.base.json +190 -190
- package/docs/templates/agent-dag.final-verification.json +185 -185
- package/docs/templates/agent-dag.schema.json +411 -411
- package/docs/templates/agent-dag.supervised-implementation.json +620 -620
- package/docs/templates/backend-test-analysis.schema.json +44 -44
- package/docs/templates/backend-test-case-manifest.schema.json +190 -190
- package/docs/templates/backend-test-dag.classify.prompt.md +75 -75
- package/docs/templates/backend-test-dag.generate-pytest.prompt.md +204 -204
- package/docs/templates/backend-test-dag.json +559 -559
- package/docs/templates/backend-test-dag.retrospect.prompt.md +139 -139
- package/docs/templates/backend-test-dag.review-cases.prompt.md +83 -83
- package/docs/templates/backend-test-execution.schema.json +133 -133
- package/docs/templates/backend-test-result.schema.json +99 -99
- package/docs/templates/branch-merge-report.md +0 -1
- package/docs/templates/exec-plan.md +64 -64
- package/docs/templates/feature-spec.md +53 -53
- package/docs/templates/frontend-design-contract.md +42 -42
- package/docs/templates/frontend-eval/fixtures/failures/01-type-build-error.md +17 -17
- package/docs/templates/frontend-eval/fixtures/failures/02-unit-component-test-fail.md +16 -16
- package/docs/templates/frontend-eval/fixtures/failures/03-fixture-schema-drift.md +16 -16
- package/docs/templates/frontend-eval/fixtures/failures/04-missing-loading-empty-error-state.md +16 -16
- package/docs/templates/frontend-eval/fixtures/failures/05-forbidden-write-writeset-expansion.md +16 -16
- package/docs/templates/frontend-eval/fixtures/failures/06-unapproved-dependency-add.md +16 -16
- package/docs/templates/frontend-eval/fixtures/failures/07-mock-production-on.md +21 -21
- package/docs/templates/frontend-eval/fixtures/functional/01-simple-component-style.md +29 -29
- package/docs/templates/frontend-eval/fixtures/functional/02-form-validation.md +28 -28
- package/docs/templates/frontend-eval/fixtures/functional/03-list-detail-page.md +28 -28
- package/docs/templates/frontend-eval/fixtures/functional/04-api-mock.md +29 -29
- package/docs/templates/frontend-eval/fixtures/functional/05-permission-auth-gated-ui.md +27 -27
- package/docs/templates/frontend-eval/fixtures/functional/06-ssr-server-client-boundary.md +28 -28
- package/docs/templates/frontend-eval/fixtures/functional/07-shared-public-component-api.md +28 -28
- package/docs/templates/frontend-eval/fixtures/functional/08-pure-local-no-remote.md +27 -27
- package/docs/templates/frontend-eval/metrics.md +138 -138
- package/docs/templates/frontend-eval/smoke-targets.md +53 -53
- package/docs/templates/frontend-implementation-contract.schema.json +27 -27
- package/docs/templates/frontend-task-constraints.md +35 -35
- package/docs/templates/frontend-task-requirement.md +70 -70
- package/docs/templates/frontend-test-dag.generate-cases.prompt.md +5 -5
- package/docs/templates/frontend-test-dag.json +23 -23
- package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +3 -3
- package/docs/templates/frontend-test-dag.retrospect.prompt.md +3 -3
- package/docs/templates/frontend-test-dag.review-cases.prompt.md +3 -3
- package/docs/templates/frontend-test-dag.review-execution.prompt.md +3 -3
- package/docs/templates/harness.schema.json +221 -221
- package/docs/templates/hybrid-dag.json +188 -188
- package/docs/templates/init-evolution-review.md +35 -35
- package/docs/templates/interactive-ui-round2-experiment.md +66 -66
- package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -118
- package/docs/templates/knowledge-sync-dag.json +178 -178
- package/docs/templates/knowledge-sync-draft.schema.json +71 -71
- package/docs/templates/product-line/AGENTS.md +8 -8
- package/docs/templates/product-line/README.md +9 -9
- package/docs/templates/product-line/acceptance.yaml +14 -14
- package/docs/templates/product-line/closeout.yaml +9 -9
- package/docs/templates/product-line/design.md +13 -13
- package/docs/templates/product-line/links.md +10 -10
- package/docs/templates/product-line/requirement.md +17 -17
- package/docs/templates/product-line/task-graph.yaml +15 -15
- package/docs/templates/product-line/task.yaml +64 -64
- package/docs/templates/product-line/test-plan.md +7 -7
- package/docs/templates/production-readiness-checklist.md +57 -57
- package/docs/templates/progress-log.md +17 -17
- package/docs/templates/project-start-checklist.md +9 -9
- package/docs/templates/qa-report.md +48 -48
- package/docs/templates/sprint-contract.md +29 -29
- package/docs/templates/worker-dogfood-evidence.md +80 -80
- package/docs/templates/worker-dogfood-setup.md +68 -68
- package/examples/decision-gate-agent-dag.json +173 -173
- package/examples/example-dag.json +46 -46
- package/examples/hybrid-loop-agent-dag.json +188 -188
- package/harness.json +66 -66
- package/package.json +78 -52
- package/scripts/kb-bootstrap-init-skeleton.sh +240 -240
- package/scripts/kb-graph-incremental-prepare.mjs +386 -386
- package/scripts/kb-graph-materialize.mjs +105 -105
- package/scripts/kb-graph-promote.mjs +164 -164
- package/scripts/kb-query.mjs +554 -554
- package/skills/agent-worker/SKILL.md +39 -39
- package/skills/agent-worker/references/agent-worker-operator.md +60 -60
- package/skills/ai-engineering-context/SKILL.md +48 -48
- package/skills/analyze-product-dependencies/SKILL.md +67 -67
- package/skills/analyze-product-dependencies/agents/openai.yaml +4 -4
- package/skills/analyze-product-dependencies/references/api-documentation-schema.md +30 -30
- package/skills/analyze-product-dependencies/references/dependency-analysis-schema.md +28 -28
- package/skills/analyze-product-dependencies/references/example.md +76 -76
- package/skills/analyze-product-dependencies/references/forward-test-cases.md +35 -35
- package/skills/analyze-product-dependencies/references/input-contract.md +11 -11
- package/skills/analyze-product-dependencies/references/scouting-rules.md +61 -61
- package/skills/analyze-product-dependencies/scripts/test-validators.mjs +267 -267
- package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +101 -101
- package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +142 -142
- package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +76 -76
- package/skills/analyze-product-dependencies/scripts/validation-helpers.mjs +146 -146
- package/skills/analyze-product-requirements/SKILL.md +90 -90
- package/skills/analyze-product-requirements/agents/openai.yaml +4 -4
- package/skills/analyze-product-requirements/references/acceptance-criteria.md +91 -91
- package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +56 -56
- package/skills/analyze-product-requirements/references/example.md +86 -86
- package/skills/analyze-product-requirements/references/forward-test-cases.md +66 -66
- package/skills/analyze-product-requirements/references/product-analysis-schema.md +32 -32
- package/skills/analyze-product-requirements/references/product-requirement-schema.md +33 -33
- package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +35 -35
- package/skills/analyze-product-requirements/scripts/test-validators.mjs +193 -193
- package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +69 -69
- package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +97 -97
- package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +98 -98
- package/skills/analyze-product-requirements/scripts/validation-helpers.mjs +156 -156
- package/skills/browser-tools/SKILL.md +196 -196
- package/skills/browser-tools/browser-content.js +103 -103
- package/skills/browser-tools/browser-cookies.js +35 -35
- package/skills/browser-tools/browser-eval.js +53 -53
- package/skills/browser-tools/browser-hn-scraper.js +108 -108
- package/skills/browser-tools/browser-nav.js +44 -44
- package/skills/browser-tools/browser-pick.js +162 -162
- package/skills/browser-tools/browser-screenshot.js +34 -34
- package/skills/browser-tools/browser-start.js +86 -86
- package/skills/browser-tools/package-lock.json +2556 -2556
- package/skills/browser-tools/package.json +19 -19
- package/skills/code-review-core/SKILL.md +20 -20
- package/skills/codebase-scout/SKILL.md +19 -19
- package/skills/frontend-design-review/SKILL.md +66 -66
- package/skills/frontend-design-review/references/review-checklist.md +40 -58
- package/skills/frontend-implementation/SKILL.md +49 -49
- package/skills/frontend-implementation/references/code-standards.md +32 -32
- package/skills/frontend-implementation/references/design-spec.md +46 -46
- package/skills/frontend-implementation/references/node-contracts.md +27 -27
- package/skills/frontend-review/SKILL.md +61 -59
- package/skills/frontend-review/references/review-findings.md +48 -47
- package/skills/frontend-verification/SKILL.md +55 -53
- package/skills/frontend-verification/references/verification-checklist.md +59 -68
- package/skills/grill-me/SKILL.md +10 -10
- package/skills/grill-with-docs/SKILL.md +88 -88
- package/skills/grill-with-docs/adr-format.md +47 -47
- package/skills/grill-with-docs/context-format.md +60 -60
- package/skills/init-capability-evolution/SKILL.md +70 -70
- package/skills/loop-agent/SKILL.md +151 -151
- package/skills/loop-agent/references/README.md +67 -67
- package/skills/loop-agent/references/command-reference.md +527 -527
- package/skills/loop-agent/references/docs-converge.md +126 -126
- package/skills/loop-agent/references/harness-policy.md +263 -263
- package/skills/loop-agent/references/hybrid-dag.md +243 -243
- package/skills/loop-agent/references/learned/README.md +21 -21
- package/skills/loop-agent/references/long-running-loop.md +57 -57
- package/skills/loop-agent/references/model-routing.md +36 -36
- package/skills/loop-agent/references/multi-worktree.md +54 -54
- package/skills/loop-agent/references/one-shot-runs.md +85 -85
- package/skills/loop-agent/references/orchestrator-and-interventions.md +169 -169
- package/skills/loop-agent/references/pi-prompt.md +23 -23
- package/skills/loop-agent/references/pi-subagent-assisted-mode.md +84 -84
- package/skills/loop-agent/references/post-implementation-and-patterns.md +44 -44
- package/skills/loop-agent/references/task-workflow.md +89 -89
- package/skills/loop-agent/references/verification-and-failure-handling.md +141 -141
- package/skills/playwright-cli/SKILL.md +420 -420
- package/skills/playwright-cli/references/element-attributes.md +23 -23
- package/skills/playwright-cli/references/playwright-tests.md +39 -39
- package/skills/playwright-cli/references/request-mocking.md +87 -87
- package/skills/playwright-cli/references/running-code.md +241 -241
- package/skills/playwright-cli/references/session-management.md +225 -225
- package/skills/playwright-cli/references/storage-state.md +275 -275
- package/skills/playwright-cli/references/test-generation.md +433 -433
- package/skills/playwright-cli/references/tracing.md +139 -139
- package/skills/playwright-cli/references/video-recording.md +143 -143
- package/skills/playwright-cli-case-generator/SKILL.md +74 -74
- package/skills/requesting-code-review/SKILL.md +101 -101
- package/skills/requesting-code-review/code-reviewer.md +168 -168
- package/skills/systematic-debugging/CREATION-LOG.md +119 -119
- package/skills/systematic-debugging/SKILL.md +296 -296
- package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
- package/skills/systematic-debugging/condition-based-waiting.md +115 -115
- package/skills/systematic-debugging/defense-in-depth.md +122 -122
- package/skills/systematic-debugging/find-polluter.sh +63 -63
- package/skills/systematic-debugging/root-cause-tracing.md +169 -169
- package/skills/systematic-debugging/test-academic.md +14 -14
- package/skills/systematic-debugging/test-pressure-1.md +58 -58
- package/skills/systematic-debugging/test-pressure-2.md +68 -68
- package/skills/systematic-debugging/test-pressure-3.md +69 -69
- package/skills/test-driven-development/SKILL.md +20 -20
- package/skills/using-git-worktrees/SKILL.md +215 -215
- package/skills/verification-before-completion/SKILL.md +154 -154
- package/skills/webapp-testing/SKILL.md +19 -19
- package/docs/agent-dag-recovery-playbook.md +0 -195
- package/docs/agent-dag-runner.md +0 -67
- package/docs/cursor-prompt-sidecar.md +0 -36
- package/docs/decisions/README.md +0 -18
- package/docs/design/README.md +0 -167
- package/docs/development-principles.md +0 -73
- package/docs/exec-plans/README.md +0 -6
- package/docs/exec-plans/active/README.md +0 -12
- package/docs/exec-plans/completed/README.md +0 -107
- package/docs/feature-workflow.md +0 -414
- package/docs/loop-agent-harness.md +0 -142
- package/docs/production-readiness.md +0 -96
- package/docs/progress/README.md +0 -80
- package/docs/reports/README.md +0 -159
- package/docs/verification-matrix.md +0 -70
- package/scripts/check-product-line-docs.sh +0 -29
- package/scripts/check-task-pool-root.sh +0 -32
- package/scripts/kb-graph-incremental-prepare.sh +0 -5
- package/scripts/kb-graph-materialize.sh +0 -4
- package/scripts/kb-graph-promote.sh +0 -4
- package/scripts/kb-query.sh +0 -5
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
# Frontend-implementation Smoke Targets 策略(M0)
|
|
2
|
-
|
|
3
|
-
## 原则
|
|
4
|
-
|
|
5
|
-
1. **仅使用平台临时目录**(`os.tmpdir()` / CI runner temp),**不得**在 loop-agent 仓库根写入可运行 app、`node_modules` 或构建产物。
|
|
6
|
-
2. **不启动浏览器**;不安装 Playwright/Cypress;不声明 Browser verification。
|
|
7
|
-
3. M0 只冻结**目标描述与生成约定**;真正从 fixture 物化临时项目在 **M1+ dogfood** 时实施。
|
|
8
|
-
4. 临时项目生命周期:创建 → 最小依赖安装(仅 temp)→ 跑冻结 static/behavior 命令 → 删除;失败日志可复制到 run-owned harness 目录,不进 git。
|
|
9
|
-
|
|
10
|
-
## 三类可控目标
|
|
11
|
-
|
|
12
|
-
| targetId | 栈 | 最小信号 | 建议 static | 建议 behavior | Browser |
|
|
13
|
-
|----------|----|----------|-------------|---------------|---------|
|
|
14
|
-
| `react-vitest-min` | React + Vitest + TypeScript | `package.json` scripts: `typecheck`, `build`/`vite build`, `test`;`src/**/*.tsx` | `npm run typecheck`(+ build 若存在) | `npm test` / `npx vitest run` | not-run |
|
|
15
|
-
| `nextjs-min` | Next.js(App Router 信号) | `app/` 或 `pages/` + `"next"` dependency;`"use client"` 边界样例 | `npm run typecheck` / `next build`(temp only) | 聚焦 unit/component test,**不** `next start` 作完成证据 | not-run |
|
|
16
|
-
| `vue-vitest-min` | Vue 3 + Vitest | `*.vue` + vitest config | `npm run typecheck` 或 `vue-tsc` | `npm test` | not-run |
|
|
17
|
-
|
|
18
|
-
## 临时项目生成约定(M1+ 实施)
|
|
19
|
-
|
|
20
|
-
```text
|
|
21
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/fe-eval-XXXXXX")"
|
|
22
|
-
# 从 docs/templates/frontend-eval/fixtures/... 渲染 package.json / 源文件骨架
|
|
23
|
-
# npm install --prefix "$ROOT" # 仅 temp
|
|
24
|
-
# 在 $ROOT 执行冻结 verify 命令
|
|
25
|
-
# rm -rf "$ROOT"
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
约束:
|
|
29
|
-
|
|
30
|
-
- fixture **不得**内嵌密钥、真实 PII、恶意脚本。
|
|
31
|
-
- 依赖版本钉死在 fixture 清单,避免 eval 漂移。
|
|
32
|
-
- 不得 `npm link` 工作区 loop-agent 作为被测 app 依赖(controller 版本另按任务约束)。
|
|
33
|
-
|
|
34
|
-
## 与 functional / failure fixtures 映射
|
|
35
|
-
|
|
36
|
-
| fixture 类别 | 优先 target |
|
|
37
|
-
|--------------|-------------|
|
|
38
|
-
| simple component / style | react-vitest-min, vue-vitest-min |
|
|
39
|
-
| form validation | react-vitest-min |
|
|
40
|
-
| list/detail | react-vitest-min, nextjs-min |
|
|
41
|
-
| API + Mock | react-vitest-min(+ MSW 骨架) |
|
|
42
|
-
| permission UI | react-vitest-min, nextjs-min |
|
|
43
|
-
| SSR / server-client boundary | nextjs-min |
|
|
44
|
-
| shared component API | react-vitest-min |
|
|
45
|
-
| pure local no-remote | 任一 |
|
|
46
|
-
| failure: type/build | 任一 |
|
|
47
|
-
| failure: mock production-on | react-vitest-min + mock 骨架 |
|
|
48
|
-
|
|
49
|
-
## 明确不做
|
|
50
|
-
|
|
51
|
-
- 不在本仓库 `website/**` 或 examples 中落永久 dogfood app 作为 M0 必需项。
|
|
52
|
-
- 不把 `scripts/check-repo.sh` 全量当作前端 app 验证。
|
|
53
|
-
- 不提交 temp 安装树或截图基线。
|
|
1
|
+
# Frontend-implementation Smoke Targets 策略(M0)
|
|
2
|
+
|
|
3
|
+
## 原则
|
|
4
|
+
|
|
5
|
+
1. **仅使用平台临时目录**(`os.tmpdir()` / CI runner temp),**不得**在 loop-agent 仓库根写入可运行 app、`node_modules` 或构建产物。
|
|
6
|
+
2. **不启动浏览器**;不安装 Playwright/Cypress;不声明 Browser verification。
|
|
7
|
+
3. M0 只冻结**目标描述与生成约定**;真正从 fixture 物化临时项目在 **M1+ dogfood** 时实施。
|
|
8
|
+
4. 临时项目生命周期:创建 → 最小依赖安装(仅 temp)→ 跑冻结 static/behavior 命令 → 删除;失败日志可复制到 run-owned harness 目录,不进 git。
|
|
9
|
+
|
|
10
|
+
## 三类可控目标
|
|
11
|
+
|
|
12
|
+
| targetId | 栈 | 最小信号 | 建议 static | 建议 behavior | Browser |
|
|
13
|
+
|----------|----|----------|-------------|---------------|---------|
|
|
14
|
+
| `react-vitest-min` | React + Vitest + TypeScript | `package.json` scripts: `typecheck`, `build`/`vite build`, `test`;`src/**/*.tsx` | `npm run typecheck`(+ build 若存在) | `npm test` / `npx vitest run` | not-run |
|
|
15
|
+
| `nextjs-min` | Next.js(App Router 信号) | `app/` 或 `pages/` + `"next"` dependency;`"use client"` 边界样例 | `npm run typecheck` / `next build`(temp only) | 聚焦 unit/component test,**不** `next start` 作完成证据 | not-run |
|
|
16
|
+
| `vue-vitest-min` | Vue 3 + Vitest | `*.vue` + vitest config | `npm run typecheck` 或 `vue-tsc` | `npm test` | not-run |
|
|
17
|
+
|
|
18
|
+
## 临时项目生成约定(M1+ 实施)
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/fe-eval-XXXXXX")"
|
|
22
|
+
# 从 docs/templates/frontend-eval/fixtures/... 渲染 package.json / 源文件骨架
|
|
23
|
+
# npm install --prefix "$ROOT" # 仅 temp
|
|
24
|
+
# 在 $ROOT 执行冻结 verify 命令
|
|
25
|
+
# rm -rf "$ROOT"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
约束:
|
|
29
|
+
|
|
30
|
+
- fixture **不得**内嵌密钥、真实 PII、恶意脚本。
|
|
31
|
+
- 依赖版本钉死在 fixture 清单,避免 eval 漂移。
|
|
32
|
+
- 不得 `npm link` 工作区 loop-agent 作为被测 app 依赖(controller 版本另按任务约束)。
|
|
33
|
+
|
|
34
|
+
## 与 functional / failure fixtures 映射
|
|
35
|
+
|
|
36
|
+
| fixture 类别 | 优先 target |
|
|
37
|
+
|--------------|-------------|
|
|
38
|
+
| simple component / style | react-vitest-min, vue-vitest-min |
|
|
39
|
+
| form validation | react-vitest-min |
|
|
40
|
+
| list/detail | react-vitest-min, nextjs-min |
|
|
41
|
+
| API + Mock | react-vitest-min(+ MSW 骨架) |
|
|
42
|
+
| permission UI | react-vitest-min, nextjs-min |
|
|
43
|
+
| SSR / server-client boundary | nextjs-min |
|
|
44
|
+
| shared component API | react-vitest-min |
|
|
45
|
+
| pure local no-remote | 任一 |
|
|
46
|
+
| failure: type/build | 任一 |
|
|
47
|
+
| failure: mock production-on | react-vitest-min + mock 骨架 |
|
|
48
|
+
|
|
49
|
+
## 明确不做
|
|
50
|
+
|
|
51
|
+
- 不在本仓库 `website/**` 或 examples 中落永久 dogfood app 作为 M0 必需项。
|
|
52
|
+
- 不把 `scripts/check-repo.sh` 全量当作前端 app 验证。
|
|
53
|
+
- 不提交 temp 安装树或截图基线。
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "frontend-implementation-contract-v1",
|
|
4
|
-
"title": "Frontend Implementation Contract v1",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"additionalProperties": false,
|
|
7
|
-
"required": ["schemaVersion", "sourceBinding", "riskLevel", "targets", "requirements", "uiStates", "interactions", "mockApi", "designEvidence", "verificationTargets", "evidenceGaps"],
|
|
8
|
-
"properties": {
|
|
9
|
-
"schemaVersion": { "const": 1 },
|
|
10
|
-
"sourceBinding": { "$ref": "#/$defs/sourceBinding" },
|
|
11
|
-
"riskLevel": { "enum": ["small", "standard", "high-risk"] },
|
|
12
|
-
"targets": { "type": "object", "additionalProperties": false, "required": ["files"], "properties": { "files": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/path" } }, "routes": { "type": "array", "items": { "type": "string", "pattern": "^/" } }, "publicApiChanges": { "type": "array", "items": { "type": "string", "minLength": 1 } } } },
|
|
13
|
-
"requirements": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["id", "implementationTargets", "verificationTargetIds"], "properties": { "id": { "$ref": "#/$defs/requirementId" }, "implementationTargets": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "verificationTargetIds": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "evidenceGap": { "$ref": "#/$defs/gap" } } } },
|
|
14
|
-
"uiStates": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["name", "applicable"], "properties": { "name": { "type": "string", "minLength": 1 }, "applicable": { "type": "boolean" }, "expectedBehavior": { "type": "string", "minLength": 1 }, "implementationTargets": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "verificationTargetIds": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "notApplicableReason": { "type": "string", "minLength": 1 } } } },
|
|
15
|
-
"interactions": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["name", "implementationTargets", "verificationTargetIds"], "properties": { "name": { "type": "string", "minLength": 1 }, "implementationTargets": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "verificationTargetIds": { "type": "array", "items": { "type": "string" } } } } },
|
|
16
|
-
"mockApi": { "type": "object", "additionalProperties": false, "required": ["strategy", "productionDefaultOff", "activation", "endpoints"], "properties": { "strategy": { "enum": ["native", "browser-intercept", "request-adapter", "not-needed"] }, "productionDefaultOff": { "const": true }, "activation": { "type": "string", "minLength": 1 }, "endpoints": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["method", "path"], "properties": { "method": { "enum": ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"] }, "path": { "type": "string", "pattern": "^/" }, "fixture": { "$ref": "#/$defs/path" }, "consumer": { "$ref": "#/$defs/path" } } } } } },
|
|
17
|
-
"designEvidence": { "type": "object", "additionalProperties": false, "required": ["source", "paths", "conflicts"], "properties": { "source": { "type": "string", "minLength": 1 }, "paths": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "conflicts": { "type": "array", "items": { "type": "string", "minLength": 1 } } } },
|
|
18
|
-
"verificationTargets": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["id", "type", "commandLabel", "file", "requirementIds", "uiStates"], "properties": { "id": { "type": "string", "minLength": 1 }, "type": { "enum": ["static", "unit", "component", "integration", "mock"] }, "commandLabel": { "type": "string", "minLength": 1 }, "file": { "$ref": "#/$defs/path" }, "symbol": { "type": "string", "minLength": 1 }, "requirementIds": { "type": "array", "items": { "$ref": "#/$defs/requirementId" } }, "uiStates": { "type": "array", "items": { "type": "string", "minLength": 1 } } } } },
|
|
19
|
-
"evidenceGaps": { "type": "array", "items": { "$ref": "#/$defs/gap" } }
|
|
20
|
-
},
|
|
21
|
-
"$defs": {
|
|
22
|
-
"path": { "type": "string", "minLength": 1, "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\).+$" },
|
|
23
|
-
"requirementId": { "type": "string", "pattern": "^(?:REQ|BR|AC)-[A-Z0-9]+(?:-[A-Z0-9]+)*$" },
|
|
24
|
-
"gap": { "type": "object", "additionalProperties": false, "required": ["description", "blocking"], "properties": { "requirementId": { "$ref": "#/$defs/requirementId" }, "description": { "type": "string", "minLength": 1 }, "blocking": { "type": "boolean" } } },
|
|
25
|
-
"sourceBinding": { "type": "object", "additionalProperties": false, "required": ["taskId", "requirementPath", "requirementSha256", "referencePaths", "requirementIds"], "properties": { "taskId": { "type": "string", "minLength": 1 }, "requirementPath": { "$ref": "#/$defs/path" }, "requirementSha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "referencePaths": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "requirementIds": { "type": "array", "items": { "$ref": "#/$defs/requirementId" } } } }
|
|
26
|
-
}
|
|
27
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "frontend-implementation-contract-v1",
|
|
4
|
+
"title": "Frontend Implementation Contract v1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schemaVersion", "sourceBinding", "riskLevel", "targets", "requirements", "uiStates", "interactions", "mockApi", "designEvidence", "verificationTargets", "evidenceGaps"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schemaVersion": { "const": 1 },
|
|
10
|
+
"sourceBinding": { "$ref": "#/$defs/sourceBinding" },
|
|
11
|
+
"riskLevel": { "enum": ["small", "standard", "high-risk"] },
|
|
12
|
+
"targets": { "type": "object", "additionalProperties": false, "required": ["files"], "properties": { "files": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/path" } }, "routes": { "type": "array", "items": { "type": "string", "pattern": "^/" } }, "publicApiChanges": { "type": "array", "items": { "type": "string", "minLength": 1 } } } },
|
|
13
|
+
"requirements": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["id", "implementationTargets", "verificationTargetIds"], "properties": { "id": { "$ref": "#/$defs/requirementId" }, "implementationTargets": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "verificationTargetIds": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "evidenceGap": { "$ref": "#/$defs/gap" } } } },
|
|
14
|
+
"uiStates": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["name", "applicable"], "properties": { "name": { "type": "string", "minLength": 1 }, "applicable": { "type": "boolean" }, "expectedBehavior": { "type": "string", "minLength": 1 }, "implementationTargets": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "verificationTargetIds": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "notApplicableReason": { "type": "string", "minLength": 1 } } } },
|
|
15
|
+
"interactions": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["name", "implementationTargets", "verificationTargetIds"], "properties": { "name": { "type": "string", "minLength": 1 }, "implementationTargets": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "verificationTargetIds": { "type": "array", "items": { "type": "string" } } } } },
|
|
16
|
+
"mockApi": { "type": "object", "additionalProperties": false, "required": ["strategy", "productionDefaultOff", "activation", "endpoints"], "properties": { "strategy": { "enum": ["native", "browser-intercept", "request-adapter", "not-needed"] }, "productionDefaultOff": { "const": true }, "activation": { "type": "string", "minLength": 1 }, "endpoints": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["method", "path"], "properties": { "method": { "enum": ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"] }, "path": { "type": "string", "pattern": "^/" }, "fixture": { "$ref": "#/$defs/path" }, "consumer": { "$ref": "#/$defs/path" } } } } } },
|
|
17
|
+
"designEvidence": { "type": "object", "additionalProperties": false, "required": ["source", "paths", "conflicts"], "properties": { "source": { "type": "string", "minLength": 1 }, "paths": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "conflicts": { "type": "array", "items": { "type": "string", "minLength": 1 } } } },
|
|
18
|
+
"verificationTargets": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["id", "type", "commandLabel", "file", "requirementIds", "uiStates"], "properties": { "id": { "type": "string", "minLength": 1 }, "type": { "enum": ["static", "unit", "component", "integration", "mock"] }, "commandLabel": { "type": "string", "minLength": 1 }, "file": { "$ref": "#/$defs/path" }, "symbol": { "type": "string", "minLength": 1 }, "requirementIds": { "type": "array", "items": { "$ref": "#/$defs/requirementId" } }, "uiStates": { "type": "array", "items": { "type": "string", "minLength": 1 } } } } },
|
|
19
|
+
"evidenceGaps": { "type": "array", "items": { "$ref": "#/$defs/gap" } }
|
|
20
|
+
},
|
|
21
|
+
"$defs": {
|
|
22
|
+
"path": { "type": "string", "minLength": 1, "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\).+$" },
|
|
23
|
+
"requirementId": { "type": "string", "pattern": "^(?:REQ|BR|AC)-[A-Z0-9]+(?:-[A-Z0-9]+)*$" },
|
|
24
|
+
"gap": { "type": "object", "additionalProperties": false, "required": ["description", "blocking"], "properties": { "requirementId": { "$ref": "#/$defs/requirementId" }, "description": { "type": "string", "minLength": 1 }, "blocking": { "type": "boolean" } } },
|
|
25
|
+
"sourceBinding": { "type": "object", "additionalProperties": false, "required": ["taskId", "requirementPath", "requirementSha256", "referencePaths", "requirementIds"], "properties": { "taskId": { "type": "string", "minLength": 1 }, "requirementPath": { "$ref": "#/$defs/path" }, "requirementSha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "referencePaths": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "requirementIds": { "type": "array", "items": { "$ref": "#/$defs/requirementId" } } } }
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
# 前端任务执行约束模板
|
|
2
|
-
|
|
3
|
-
## 技术约束
|
|
4
|
-
|
|
5
|
-
TODO
|
|
6
|
-
|
|
7
|
-
## 代码风格约束
|
|
8
|
-
|
|
9
|
-
TODO
|
|
10
|
-
|
|
11
|
-
## 设计约束
|
|
12
|
-
|
|
13
|
-
TODO
|
|
14
|
-
|
|
15
|
-
## 验证约束
|
|
16
|
-
|
|
17
|
-
TODO
|
|
18
|
-
|
|
19
|
-
## Mock 约束(数据型任务)
|
|
20
|
-
|
|
21
|
-
- Mock/API/schema 规范路径:TODO
|
|
22
|
-
- 既有 Mock service root、handler/fixture/bootstrap:TODO
|
|
23
|
-
- 既有 browser/e2e interception 或 request adapter/DI seam:TODO
|
|
24
|
-
- 启动、健康检查和专项验证命令:TODO
|
|
25
|
-
- production 禁用边界:TODO
|
|
26
|
-
- 真实请求默认路径与 Mock 显式启用方式:TODO
|
|
27
|
-
- `task.json.frontendMock.policy`:`auto | required | disabled`
|
|
28
|
-
|
|
29
|
-
## allowedPaths
|
|
30
|
-
|
|
31
|
-
TODO
|
|
32
|
-
|
|
33
|
-
## forbiddenPaths
|
|
34
|
-
|
|
35
|
-
TODO
|
|
1
|
+
# 前端任务执行约束模板
|
|
2
|
+
|
|
3
|
+
## 技术约束
|
|
4
|
+
|
|
5
|
+
TODO
|
|
6
|
+
|
|
7
|
+
## 代码风格约束
|
|
8
|
+
|
|
9
|
+
TODO
|
|
10
|
+
|
|
11
|
+
## 设计约束
|
|
12
|
+
|
|
13
|
+
TODO
|
|
14
|
+
|
|
15
|
+
## 验证约束
|
|
16
|
+
|
|
17
|
+
TODO
|
|
18
|
+
|
|
19
|
+
## Mock 约束(数据型任务)
|
|
20
|
+
|
|
21
|
+
- Mock/API/schema 规范路径:TODO
|
|
22
|
+
- 既有 Mock service root、handler/fixture/bootstrap:TODO
|
|
23
|
+
- 既有 browser/e2e interception 或 request adapter/DI seam:TODO
|
|
24
|
+
- 启动、健康检查和专项验证命令:TODO
|
|
25
|
+
- production 禁用边界:TODO
|
|
26
|
+
- 真实请求默认路径与 Mock 显式启用方式:TODO
|
|
27
|
+
- `task.json.frontendMock.policy`:`auto | required | disabled`
|
|
28
|
+
|
|
29
|
+
## allowedPaths
|
|
30
|
+
|
|
31
|
+
TODO
|
|
32
|
+
|
|
33
|
+
## forbiddenPaths
|
|
34
|
+
|
|
35
|
+
TODO
|
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
# 前端任务需求模板
|
|
2
|
-
|
|
3
|
-
## 用户目标
|
|
4
|
-
|
|
5
|
-
TODO
|
|
6
|
-
|
|
7
|
-
## 目标页面/组件/路由
|
|
8
|
-
|
|
9
|
-
TODO
|
|
10
|
-
|
|
11
|
-
## 用户流程
|
|
12
|
-
|
|
13
|
-
TODO
|
|
14
|
-
|
|
15
|
-
## 必须状态
|
|
16
|
-
|
|
17
|
-
### loading
|
|
18
|
-
|
|
19
|
-
TODO
|
|
20
|
-
|
|
21
|
-
### empty
|
|
22
|
-
|
|
23
|
-
TODO
|
|
24
|
-
|
|
25
|
-
### error
|
|
26
|
-
|
|
27
|
-
TODO
|
|
28
|
-
|
|
29
|
-
### success
|
|
30
|
-
|
|
31
|
-
TODO
|
|
32
|
-
|
|
33
|
-
### disabled
|
|
34
|
-
|
|
35
|
-
TODO
|
|
36
|
-
|
|
37
|
-
## 目标运行环境
|
|
38
|
-
|
|
39
|
-
### desktop
|
|
40
|
-
|
|
41
|
-
TODO
|
|
42
|
-
|
|
43
|
-
### mobile
|
|
44
|
-
|
|
45
|
-
TODO
|
|
46
|
-
|
|
47
|
-
### tablet
|
|
48
|
-
|
|
49
|
-
TODO
|
|
50
|
-
|
|
51
|
-
## 交互要求
|
|
52
|
-
|
|
53
|
-
TODO
|
|
54
|
-
|
|
55
|
-
## 接口与 Mock 输入
|
|
56
|
-
|
|
57
|
-
- 接口文档/schema:TODO
|
|
58
|
-
- endpoint、method、关键请求/响应字段:TODO
|
|
59
|
-
- 是否允许依赖真实后端:TODO
|
|
60
|
-
- 是否要求离线或独立行为验证:TODO
|
|
61
|
-
- success/empty/error/permission 状态:TODO
|
|
62
|
-
- 后端当前就绪状态与 Real Integration Gap:TODO
|
|
63
|
-
|
|
64
|
-
## 验收标准
|
|
65
|
-
|
|
66
|
-
TODO
|
|
67
|
-
|
|
68
|
-
## 非目标
|
|
69
|
-
|
|
70
|
-
TODO
|
|
1
|
+
# 前端任务需求模板
|
|
2
|
+
|
|
3
|
+
## 用户目标
|
|
4
|
+
|
|
5
|
+
TODO
|
|
6
|
+
|
|
7
|
+
## 目标页面/组件/路由
|
|
8
|
+
|
|
9
|
+
TODO
|
|
10
|
+
|
|
11
|
+
## 用户流程
|
|
12
|
+
|
|
13
|
+
TODO
|
|
14
|
+
|
|
15
|
+
## 必须状态
|
|
16
|
+
|
|
17
|
+
### loading
|
|
18
|
+
|
|
19
|
+
TODO
|
|
20
|
+
|
|
21
|
+
### empty
|
|
22
|
+
|
|
23
|
+
TODO
|
|
24
|
+
|
|
25
|
+
### error
|
|
26
|
+
|
|
27
|
+
TODO
|
|
28
|
+
|
|
29
|
+
### success
|
|
30
|
+
|
|
31
|
+
TODO
|
|
32
|
+
|
|
33
|
+
### disabled
|
|
34
|
+
|
|
35
|
+
TODO
|
|
36
|
+
|
|
37
|
+
## 目标运行环境
|
|
38
|
+
|
|
39
|
+
### desktop
|
|
40
|
+
|
|
41
|
+
TODO
|
|
42
|
+
|
|
43
|
+
### mobile
|
|
44
|
+
|
|
45
|
+
TODO
|
|
46
|
+
|
|
47
|
+
### tablet
|
|
48
|
+
|
|
49
|
+
TODO
|
|
50
|
+
|
|
51
|
+
## 交互要求
|
|
52
|
+
|
|
53
|
+
TODO
|
|
54
|
+
|
|
55
|
+
## 接口与 Mock 输入
|
|
56
|
+
|
|
57
|
+
- 接口文档/schema:TODO
|
|
58
|
+
- endpoint、method、关键请求/响应字段:TODO
|
|
59
|
+
- 是否允许依赖真实后端:TODO
|
|
60
|
+
- 是否要求离线或独立行为验证:TODO
|
|
61
|
+
- success/empty/error/permission 状态:TODO
|
|
62
|
+
- 后端当前就绪状态与 Real Integration Gap:TODO
|
|
63
|
+
|
|
64
|
+
## 验收标准
|
|
65
|
+
|
|
66
|
+
TODO
|
|
67
|
+
|
|
68
|
+
## 非目标
|
|
69
|
+
|
|
70
|
+
TODO
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
# Generate frontend functional cases
|
|
2
|
-
|
|
3
|
-
Use `playwright-cli-case-generator`. Read only `testcase/frontend/rag/context.md`, `coverage-map.md`, and existing `testcase/frontend/cases/`; write only that cases directory. Produce Markdown cases, `index.md`, and schema-version-1 `manifest.json`. Do not generate pytest or Playwright source code.
|
|
4
|
-
|
|
5
|
-
Each case is independently executable and includes AC mapping, preconditions, session, cleanup, UI assertions, and isolated evidence paths. Use dimensions `core`, `boundary`, `flow`, or `backend`. Never guess API fields, constraints, SLA, credentials, or unrecorded data. The open command is exactly `playwright-cli open --browser=chrome --headed <base-url>`.
|
|
1
|
+
# Generate frontend functional cases
|
|
2
|
+
|
|
3
|
+
Use `playwright-cli-case-generator`. Read only `testcase/frontend/rag/context.md`, `coverage-map.md`, and existing `testcase/frontend/cases/`; write only that cases directory. Produce Markdown cases, `index.md`, and schema-version-1 `manifest.json`. Do not generate pytest or Playwright source code.
|
|
4
|
+
|
|
5
|
+
Each case is independently executable and includes AC mapping, preconditions, session, cleanup, UI assertions, and isolated evidence paths. Use dimensions `core`, `boundary`, `flow`, or `backend`. Never guess API fields, constraints, SLA, credentials, or unrecorded data. The open command is exactly `playwright-cli open --browser=chrome --headed <base-url>`.
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "./agent-dag.schema.json",
|
|
3
|
-
"version": 3,
|
|
4
|
-
"title": "Frontend test RAG DAG template",
|
|
5
|
-
"runtimeContract": { "schemaVersion": 1, "agentRuntime": "pi-only", "repairWriterProtocol": "explicit-node-v1" },
|
|
6
|
-
"objective": "Build a frontend test RAG package, generate Markdown cases, execute each case serially through playwright-cli, and retain browser evidence.",
|
|
7
|
-
"globalConstraints": [
|
|
8
|
-
"Do not generate pytest or Playwright source code.",
|
|
9
|
-
"Only use declared isolated test environments; production URLs and real credentials are blocked.",
|
|
10
|
-
"Every generated browser start command is playwright-cli open --browser=chrome --headed <base-url>.",
|
|
11
|
-
"Case children execute serially. Persist each case result, logs and browser evidence before the next child starts.",
|
|
12
|
-
"A token threshold is a post-case stop check, not a model hard token cap; unstarted cases must be recorded as blocked: token-budget-exhausted."
|
|
13
|
-
],
|
|
14
|
-
"tasks": [
|
|
15
|
-
{ "id": "retrieve-frontend-test-context-pi", "depends_on": [], "executor": "pi", "role": "planner", "toolProfile": "write", "complexity": "HIGH", "writePolicy": "exclusive", "writeSet": ["testcase/frontend/rag/**"], "allowedPaths": ["REPLACE/WITH/SOURCE/PATH/**", "testcase/frontend/rag/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "RAG context.md and coverage-map.md.", "subtask_prompt_markdown": "./frontend-test-dag.retrieve-context.prompt.md" },
|
|
16
|
-
{ "id": "generate-frontend-functional-cases-pi", "depends_on": ["retrieve-frontend-test-context-pi"], "executor": "pi", "role": "implementer", "toolProfile": "write", "complexity": "HIGH", "writePolicy": "exclusive", "writeSet": ["testcase/frontend/cases/**"], "allowedPaths": ["testcase/frontend/rag/**", "testcase/frontend/cases/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "Markdown cases, index.md and manifest.json schemaVersion 1; no test source code.", "subtask_prompt_markdown": "./frontend-test-dag.generate-cases.prompt.md" },
|
|
17
|
-
{ "id": "review-frontend-cases-pi", "depends_on": ["generate-frontend-functional-cases-pi"], "executor": "pi", "role": "reviewer", "complexity": "HIGH", "writePolicy": "read-only", "allowedPaths": ["testcase/frontend/rag/**", "testcase/frontend/cases/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "First line VERDICT: pass or VERDICT: request-revision; no writes.", "subtask_prompt_markdown": "./frontend-test-dag.review-cases.prompt.md" },
|
|
18
|
-
{ "id": "materialize-frontend-case-manifest-shell", "depends_on": ["review-frontend-cases-pi"], "executor": "shell", "role": "verifier", "complexity": "LOW", "writePolicy": "read-only", "allowedPaths": ["testcase/frontend/cases/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "stdout exactly JSON { cases: [...] } after manifest validation.", "subtask_prompt": "Validate the generated frontend case manifest." },
|
|
19
|
-
{ "id": "execute-frontend-cases-map", "depends_on": ["materialize-frontend-case-manifest-shell"], "executor": "static", "role": "verifier", "complexity": "LOW", "writePolicy": "none", "allowedPaths": [], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "Serial aggregate of browser case results.", "subtask_prompt": "Expand the validated manifest into serial browser case children.", "static": { "resultMarkdown": "Frontend case map expansion barrier." }, "dynamicExpansion": { "type": "map_agent", "workflowNodeId": "execute-frontend-cases-map", "itemsFrom": "$.nodes['materialize-frontend-case-manifest-shell'].output.cases", "itemName": "case", "maxItems": 20, "maxExpandedNodes": 20, "childIdPrefix": "execute-frontend-case", "tokenBudget": { "maxTokensPerCase": 20000, "maxTotalTokens": 200000 }, "childTask": { "executor": "pi", "role": "verifier", "skills": ["playwright-cli", "webapp-testing"], "toolProfile": "write", "complexity": "MED", "subtaskPromptTemplate": "Execute {{case.caseId}} from {{case.casePath}} in a fresh Pi session. Use playwright-cli open --browser=chrome --headed <base-url>. Persist result, logs and screenshots/trace/video under {{case.evidenceDir}}; return compact JSON only.", "outputContract": "Compact JSON <=1200 chars.", "writePolicy": "exclusive", "allowedPaths": ["testcase/frontend/cases/{{case.caseId}}.md", "testcase/frontend/rag/context.md", "testcase/frontend/rag/coverage-map.md", "testcase/frontend/evidence/{{case.caseId}}/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "writeSet": ["testcase/frontend/evidence/{{case.caseId}}/**"] } } },
|
|
20
|
-
{ "id": "review-frontend-execution-pi", "depends_on": ["execute-frontend-cases-map"], "executor": "pi", "role": "reviewer", "complexity": "HIGH", "writePolicy": "read-only", "allowedPaths": ["testcase/frontend/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "AC-to-case-to-browser-evidence review.", "subtask_prompt_markdown": "./frontend-test-dag.review-execution.prompt.md" },
|
|
21
|
-
{ "id": "frontend-test-retrospect-pi", "depends_on": ["review-frontend-execution-pi"], "executor": "pi", "role": "closeout", "toolProfile": "write", "complexity": "MED", "writePolicy": "exclusive", "writeSet": ["docs/test-reports/**"], "allowedPaths": ["testcase/frontend/**", "docs/test-reports/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "Frontend test retrospective with A/B/C/D rating.", "subtask_prompt_markdown": "./frontend-test-dag.retrospect.prompt.md" }
|
|
22
|
-
]
|
|
23
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./agent-dag.schema.json",
|
|
3
|
+
"version": 3,
|
|
4
|
+
"title": "Frontend test RAG DAG template",
|
|
5
|
+
"runtimeContract": { "schemaVersion": 1, "agentRuntime": "pi-only", "repairWriterProtocol": "explicit-node-v1" },
|
|
6
|
+
"objective": "Build a frontend test RAG package, generate Markdown cases, execute each case serially through playwright-cli, and retain browser evidence.",
|
|
7
|
+
"globalConstraints": [
|
|
8
|
+
"Do not generate pytest or Playwright source code.",
|
|
9
|
+
"Only use declared isolated test environments; production URLs and real credentials are blocked.",
|
|
10
|
+
"Every generated browser start command is playwright-cli open --browser=chrome --headed <base-url>.",
|
|
11
|
+
"Case children execute serially. Persist each case result, logs and browser evidence before the next child starts.",
|
|
12
|
+
"A token threshold is a post-case stop check, not a model hard token cap; unstarted cases must be recorded as blocked: token-budget-exhausted."
|
|
13
|
+
],
|
|
14
|
+
"tasks": [
|
|
15
|
+
{ "id": "retrieve-frontend-test-context-pi", "depends_on": [], "executor": "pi", "role": "planner", "toolProfile": "write", "complexity": "HIGH", "writePolicy": "exclusive", "writeSet": ["testcase/frontend/rag/**"], "allowedPaths": ["REPLACE/WITH/SOURCE/PATH/**", "testcase/frontend/rag/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "RAG context.md and coverage-map.md.", "subtask_prompt_markdown": "./frontend-test-dag.retrieve-context.prompt.md" },
|
|
16
|
+
{ "id": "generate-frontend-functional-cases-pi", "depends_on": ["retrieve-frontend-test-context-pi"], "executor": "pi", "role": "implementer", "toolProfile": "write", "complexity": "HIGH", "writePolicy": "exclusive", "writeSet": ["testcase/frontend/cases/**"], "allowedPaths": ["testcase/frontend/rag/**", "testcase/frontend/cases/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "Markdown cases, index.md and manifest.json schemaVersion 1; no test source code.", "subtask_prompt_markdown": "./frontend-test-dag.generate-cases.prompt.md" },
|
|
17
|
+
{ "id": "review-frontend-cases-pi", "depends_on": ["generate-frontend-functional-cases-pi"], "executor": "pi", "role": "reviewer", "complexity": "HIGH", "writePolicy": "read-only", "allowedPaths": ["testcase/frontend/rag/**", "testcase/frontend/cases/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "First line VERDICT: pass or VERDICT: request-revision; no writes.", "subtask_prompt_markdown": "./frontend-test-dag.review-cases.prompt.md" },
|
|
18
|
+
{ "id": "materialize-frontend-case-manifest-shell", "depends_on": ["review-frontend-cases-pi"], "executor": "shell", "role": "verifier", "complexity": "LOW", "writePolicy": "read-only", "allowedPaths": ["testcase/frontend/cases/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "stdout exactly JSON { cases: [...] } after manifest validation.", "subtask_prompt": "Validate the generated frontend case manifest." },
|
|
19
|
+
{ "id": "execute-frontend-cases-map", "depends_on": ["materialize-frontend-case-manifest-shell"], "executor": "static", "role": "verifier", "complexity": "LOW", "writePolicy": "none", "allowedPaths": [], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "Serial aggregate of browser case results.", "subtask_prompt": "Expand the validated manifest into serial browser case children.", "static": { "resultMarkdown": "Frontend case map expansion barrier." }, "dynamicExpansion": { "type": "map_agent", "workflowNodeId": "execute-frontend-cases-map", "itemsFrom": "$.nodes['materialize-frontend-case-manifest-shell'].output.cases", "itemName": "case", "maxItems": 20, "maxExpandedNodes": 20, "childIdPrefix": "execute-frontend-case", "tokenBudget": { "maxTokensPerCase": 20000, "maxTotalTokens": 200000 }, "childTask": { "executor": "pi", "role": "verifier", "skills": ["playwright-cli", "webapp-testing"], "toolProfile": "write", "complexity": "MED", "subtaskPromptTemplate": "Execute {{case.caseId}} from {{case.casePath}} in a fresh Pi session. Use playwright-cli open --browser=chrome --headed <base-url>. Persist result, logs and screenshots/trace/video under {{case.evidenceDir}}; return compact JSON only.", "outputContract": "Compact JSON <=1200 chars.", "writePolicy": "exclusive", "allowedPaths": ["testcase/frontend/cases/{{case.caseId}}.md", "testcase/frontend/rag/context.md", "testcase/frontend/rag/coverage-map.md", "testcase/frontend/evidence/{{case.caseId}}/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "writeSet": ["testcase/frontend/evidence/{{case.caseId}}/**"] } } },
|
|
20
|
+
{ "id": "review-frontend-execution-pi", "depends_on": ["execute-frontend-cases-map"], "executor": "pi", "role": "reviewer", "complexity": "HIGH", "writePolicy": "read-only", "allowedPaths": ["testcase/frontend/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "AC-to-case-to-browser-evidence review.", "subtask_prompt_markdown": "./frontend-test-dag.review-execution.prompt.md" },
|
|
21
|
+
{ "id": "frontend-test-retrospect-pi", "depends_on": ["review-frontend-execution-pi"], "executor": "pi", "role": "closeout", "toolProfile": "write", "complexity": "MED", "writePolicy": "exclusive", "writeSet": ["docs/test-reports/**"], "allowedPaths": ["testcase/frontend/**", "docs/test-reports/**"], "forbiddenPaths": [".harness/**", "artifacts/**"], "outputContract": "Frontend test retrospective with A/B/C/D rating.", "subtask_prompt_markdown": "./frontend-test-dag.retrospect.prompt.md" }
|
|
22
|
+
]
|
|
23
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# Retrieve frontend test context
|
|
2
|
-
|
|
3
|
-
Write only `testcase/frontend/rag/context.md` and `coverage-map.md`. Record traceable facts from the task source, routes, components, API/Mock contracts, existing tests and execution contract. Do not invent fields, credentials, limits or test data.
|
|
1
|
+
# Retrieve frontend test context
|
|
2
|
+
|
|
3
|
+
Write only `testcase/frontend/rag/context.md` and `coverage-map.md`. Record traceable facts from the task source, routes, components, API/Mock contracts, existing tests and execution contract. Do not invent fields, credentials, limits or test data.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# Frontend test retrospective
|
|
2
|
-
|
|
3
|
-
Write a dated report under `docs/test-reports/` covering case coverage, passed/failed/blocked results, review findings, browser anomalies, residual risks, and an A/B/C/D maturity rating. Blocked cases never count as passed.
|
|
1
|
+
# Frontend test retrospective
|
|
2
|
+
|
|
3
|
+
Write a dated report under `docs/test-reports/` covering case coverage, passed/failed/blocked results, review findings, browser anomalies, residual risks, and an A/B/C/D maturity rating. Blocked cases never count as passed.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# Review frontend cases
|
|
2
|
-
|
|
3
|
-
Read the RAG files and Markdown cases only. First line must be `VERDICT: pass` or `VERDICT: request-revision`. Report AC coverage, case independence, evidence completeness, unsafe environment/data dependencies, and manifest issues. The verdict is advisory and does not block browser execution.
|
|
1
|
+
# Review frontend cases
|
|
2
|
+
|
|
3
|
+
Read the RAG files and Markdown cases only. First line must be `VERDICT: pass` or `VERDICT: request-revision`. Report AC coverage, case independence, evidence completeness, unsafe environment/data dependencies, and manifest issues. The verdict is advisory and does not block browser execution.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# Review frontend execution evidence
|
|
2
|
-
|
|
3
|
-
Review AC → case → browser-evidence traceability. A passed case needs assertions and screenshot or equivalent browser evidence. Failed and blocked cases need an explicit cause. Treat `token-budget-exhausted` as blocked; do not substitute model conclusions or static checks for browser evidence.
|
|
1
|
+
# Review frontend execution evidence
|
|
2
|
+
|
|
3
|
+
Review AC → case → browser-evidence traceability. A passed case needs assertions and screenshot or equivalent browser evidence. Failed and blocked cases need an explicit cause. Treat `token-budget-exhausted` as blocked; do not substitute model conclusions or static checks for browser evidence.
|