@tea-agent/loop-agent 0.10.0 → 0.12.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 +10 -2
- package/CHANGELOG.md +91 -24
- package/README.md +84 -12
- package/dist/application/dag/args.js +1 -12
- package/dist/application/dag/generate-task-dag.js +38 -2
- package/dist/application/dag/run-dag.js +11 -27
- package/dist/application/dag/validate-dag.js +13 -2
- package/dist/application/loop/run-action.js +0 -4
- package/dist/cli/command-definitions.js +44 -16
- package/dist/cli/program.js +40 -23
- package/dist/cli/update/notifier.js +117 -0
- package/dist/cli/update/npm-client.js +151 -0
- package/dist/cli/update/policy.js +58 -0
- package/dist/cli/update/state.js +68 -0
- package/dist/cli.js +33 -0
- package/dist/commands/cursor-prompt.js +42 -82
- package/dist/commands/dag-approve.js +36 -0
- package/dist/commands/delegate.js +75 -77
- package/dist/commands/doctor.js +0 -18
- package/dist/commands/init.js +547 -95
- package/dist/commands/instructions.js +7 -10
- package/dist/commands/loop.js +4 -20
- package/dist/commands/plan.js +50 -0
- package/dist/executors/config-core.js +0 -51
- package/dist/executors/dag-pi-executor.js +1 -1
- package/dist/executors/dag.js +0 -1
- package/dist/executors/index.js +0 -2
- package/dist/executors/model-routing.js +9 -9
- package/dist/executors/shell-executor.js +1 -1
- package/dist/governance/checks.js +6 -3
- package/dist/governance/exec-plans.js +545 -0
- package/dist/governance/manifest-types.js +24 -2
- package/dist/infrastructure/harness/loop-action-store.js +0 -3
- package/dist/records/harvest.js +2 -23
- package/dist/records/one-shot-runs.js +1 -1
- package/dist/shared/artifacts-core.js +24 -5
- package/dist/shared/output-truncation.js +37 -0
- package/dist/shared/package-metadata.js +488 -0
- package/dist/{executors/cursor-executor.js → sidecars/cursor-prompt/executor.js} +2 -42
- package/dist/sidecars/cursor-prompt/index.js +3 -0
- package/dist/sidecars/cursor-prompt/stream.js +121 -0
- package/dist/task/config-types.js +29 -12
- package/dist/task/delegate.js +9 -21
- package/dist/task/runtime.js +1 -2
- package/dist/worker/cli.js +32 -3
- package/dist/worker/delivery/final-verification.js +47 -11
- package/dist/worker/delivery/package.js +63 -10
- package/dist/worker/feature/run.js +60 -8
- package/dist/worker/loop-agent/loop-agent-client.js +329 -126
- package/dist/worker/observability/event-history.js +216 -0
- package/dist/worker/observability/read-model.js +338 -83
- package/dist/worker/observe/paths.js +17 -0
- package/dist/worker/observe/routes.js +165 -21
- package/dist/worker/observe/server.js +59 -1
- package/dist/worker/observe/static/api.js +27 -0
- package/dist/worker/observe/static/app.js +120 -2317
- package/dist/worker/observe/static/constants.js +148 -0
- package/dist/worker/observe/static/copy.js +67 -0
- package/dist/worker/observe/static/dag-helpers.js +172 -0
- package/dist/worker/observe/static/dag-model.js +72 -0
- package/dist/worker/observe/static/dom.js +61 -0
- package/dist/worker/observe/static/format-pool.js +67 -0
- package/dist/worker/observe/static/format.js +292 -0
- package/dist/worker/observe/static/index.html +300 -82
- package/dist/worker/observe/static/kpi.js +94 -0
- package/dist/worker/observe/static/relations.js +128 -0
- package/dist/worker/observe/static/router.js +85 -0
- package/dist/worker/observe/static/run-processing.js +148 -0
- package/dist/worker/observe/static/shell-chrome.js +68 -0
- package/dist/worker/observe/static/state.js +253 -0
- package/dist/worker/observe/static/styles.css +1720 -495
- package/dist/worker/observe/static/views/batch.js +226 -0
- package/dist/worker/observe/static/views/dag-graph.js +172 -0
- package/dist/worker/observe/static/views/dag-inspector.js +477 -0
- package/dist/worker/observe/static/views/dag.js +362 -0
- package/dist/worker/observe/static/views/dashboard.js +442 -0
- package/dist/worker/observe/static/views/failures.js +143 -0
- package/dist/worker/observe/static/views/feature.js +453 -0
- package/dist/worker/observe/static/views/pool.js +347 -0
- package/dist/worker/observe/static/views/run.js +453 -0
- package/dist/worker/observe/static/views/session-timeline.js +205 -0
- package/dist/worker/observe/static/views/shell.js +7 -0
- package/dist/worker/observe/static/views/task.js +260 -0
- package/dist/worker/observe/static/views/timeline.js +163 -0
- package/dist/worker/preflight.js +49 -1
- package/dist/worker/run-task/run-task.js +22 -12
- package/dist/worker/runner/run-ready.js +76 -12
- package/dist/worker/task-spec/schema.js +0 -1
- package/dist/workflows/dag/controller-identity.js +104 -0
- package/dist/workflows/dag/convergence/controller.js +1 -1
- package/dist/workflows/dag/executor-registry.js +0 -2
- package/dist/workflows/dag/init-hybrid.js +797 -27
- package/dist/workflows/dag/node-execution.js +183 -35
- package/dist/workflows/dag/repair-artifact.js +91 -0
- package/dist/workflows/dag/report.js +50 -0
- package/dist/workflows/dag/retry-policy.js +138 -0
- package/dist/workflows/dag/runner.js +77 -17
- package/dist/workflows/dag/runtime-contract.js +87 -0
- package/dist/workflows/dag/scheduler.js +7 -2
- package/dist/workflows/dag/sdd-embedded.js +128 -0
- package/dist/workflows/dag/skill-instructions.js +5 -4
- package/dist/workflows/dag/skill-snapshot.js +529 -0
- package/dist/workflows/dag/types.js +86 -10
- package/dist/workflows/dag/validate.js +73 -12
- package/dist/workflows/loop/actions/dag-action.js +0 -2
- package/dist/workflows/loop/actions/shared.js +1 -1
- package/dist/workflows/loop/actions.js +14 -31
- package/dist/workflows/loop/benchmark.js +1 -1
- package/dist/workflows/loop/index.js +1 -1
- package/dist/workflows/loop/policy/auto-policy.js +22 -14
- package/dist/workflows/loop/policy/path-patterns.js +13 -0
- package/docs/README.md +36 -33
- package/docs/agent-dag-recovery-playbook.md +1 -1
- package/docs/agent-dag-runner.md +28 -3
- package/docs/architecture/README.md +26 -0
- package/docs/architecture/dag-execution.md +140 -0
- package/docs/architecture/evolution.md +53 -0
- package/docs/architecture/facts-and-state.md +58 -0
- package/docs/architecture/runtime-boundaries.md +45 -17
- package/docs/architecture/system-overview.md +93 -0
- package/docs/architecture/worker-and-feature.md +81 -0
- package/docs/cursor-prompt-sidecar.md +36 -0
- package/docs/decisions/README.md +13 -1
- package/docs/design/README.md +43 -21
- package/docs/development-principles.md +2 -2
- package/docs/exec-plans/active/README.md +1 -3
- package/docs/exec-plans/completed/README.md +23 -0
- package/docs/feature-workflow.md +78 -4
- package/docs/harness-methodology-debugging.md +1 -1
- package/docs/harness-methodology-tdd.md +3 -3
- package/docs/init-surface.manifest.json +60 -25
- package/docs/loop-agent-harness.md +28 -4
- package/docs/progress/README.md +50 -1
- package/docs/reports/README.md +90 -18
- package/docs/skills/README.md +2 -1
- package/docs/skills/vetted-skill-registry.md +2 -1
- package/docs/templates/agent-dag-report.schema.json +23 -6
- package/docs/templates/agent-dag.base.json +0 -5
- package/docs/templates/agent-dag.final-verification.json +0 -5
- package/docs/templates/agent-dag.schema.json +70 -3
- package/docs/templates/agent-dag.supervised-implementation.json +9 -8
- package/docs/templates/backend-test-dag.generate-pytest.prompt.md +139 -0
- package/docs/templates/backend-test-dag.json +276 -0
- package/docs/templates/backend-test-dag.retrospect.prompt.md +125 -0
- package/docs/templates/backend-test-dag.review-cases.prompt.md +81 -0
- package/docs/templates/frontend-design-contract.md +33 -0
- package/docs/templates/frontend-task-constraints.md +25 -0
- package/docs/templates/frontend-task-requirement.md +61 -0
- package/docs/templates/harness.schema.json +10 -12
- package/docs/templates/hybrid-dag.json +1 -6
- package/docs/templates/interactive-ui-round2-experiment.md +1 -1
- package/docs/templates/product-line/task.yaml +0 -1
- package/docs/templates/project-start-checklist.md +2 -2
- package/docs/templates/worker-dogfood-evidence.md +28 -0
- package/docs/templates/worker-dogfood-setup.md +20 -0
- package/docs/verification-matrix.md +10 -0
- package/examples/decision-gate-agent-dag.json +87 -33
- package/examples/example-dag.json +0 -5
- package/examples/hybrid-loop-agent-dag.json +0 -5
- package/harness.json +7 -15
- package/package.json +22 -46
- package/scripts/check-product-line-docs.sh +10 -7
- package/skills/agent-worker/SKILL.md +37 -0
- package/skills/agent-worker/references/agent-worker-operator.md +43 -0
- package/skills/frontend-design-review/SKILL.md +59 -0
- package/skills/frontend-design-review/references/review-checklist.md +37 -0
- package/skills/frontend-implementation/SKILL.md +51 -0
- package/skills/frontend-implementation/references/code-standards.md +34 -0
- package/skills/frontend-implementation/references/design-spec.md +46 -0
- package/skills/frontend-implementation/references/node-contracts.md +32 -0
- package/skills/frontend-review/SKILL.md +53 -0
- package/skills/frontend-review/references/review-findings.md +42 -0
- package/skills/frontend-verification/SKILL.md +40 -0
- package/skills/frontend-verification/references/verification-checklist.md +56 -0
- package/skills/grill-me/SKILL.md +10 -0
- package/skills/grill-with-docs/SKILL.md +88 -0
- package/skills/grill-with-docs/adr-format.md +47 -0
- package/skills/grill-with-docs/context-format.md +60 -0
- package/skills/loop-agent/SKILL.md +11 -9
- package/skills/loop-agent/references/command-reference.md +14 -15
- package/skills/loop-agent/references/docs-converge.md +126 -0
- package/skills/loop-agent/references/harness-policy.md +7 -7
- package/skills/loop-agent/references/hybrid-dag.md +36 -20
- package/skills/loop-agent/references/long-running-loop.md +4 -6
- package/skills/loop-agent/references/multi-worktree.md +6 -6
- package/skills/loop-agent/references/orchestrator-and-interventions.md +3 -3
- package/skills/loop-agent/references/pi-subagent-assisted-mode.md +14 -11
- package/skills/loop-agent/references/task-workflow.md +1 -1
- package/skills/loop-agent/references/verification-and-failure-handling.md +6 -0
- package/skills/using-git-worktrees/SKILL.md +215 -0
- package/dist/commands/cursor-worker.js +0 -43
- package/dist/cursor-worker-entry.js +0 -8
- package/dist/executors/cursor-artifacts.js +0 -33
- package/dist/executors/cursor-execution-log.js +0 -81
- package/dist/executors/cursor-executor-artifacts.js +0 -134
- package/dist/executors/cursor-run.js +0 -115
- package/dist/executors/cursor-tool.js +0 -94
- package/dist/executors/cursor-worker-client.js +0 -223
- package/dist/executors/cursor-worker-protocol.js +0 -18
- package/dist/executors/cursor-worker-server.js +0 -54
- package/dist/executors/cursor-worker.js +0 -3
- package/dist/executors/cursor.js +0 -6
- package/dist/executors/dag-cursor-executor.js +0 -87
- package/dist/workflows/loop/actions/cursor-fix.js +0 -191
- package/dist/workflows/loop/policy/cursor-fix-policy.js +0 -31
- package/docs/cursor-executor-usage.md +0 -25
- package/docs/dynamic-workflow-dag-engine-roadmap.md +0 -1749
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./agent-dag.schema.json",
|
|
3
|
+
"version": 3,
|
|
4
|
+
"title": "Backend test DAG template",
|
|
5
|
+
"runtimeContract": {
|
|
6
|
+
"schemaVersion": 1,
|
|
7
|
+
"agentRuntime": "pi-only",
|
|
8
|
+
"repairWriterProtocol": "explicit-node-v1"
|
|
9
|
+
},
|
|
10
|
+
"objective": "End-to-end backend functional testing pipeline: analyze requirements → generate functional test cases → review cases → generate pytest automation → execute pytest → retrospective with maturity rating. Covers the full chain from requirement analysis to test maturity assessment.",
|
|
11
|
+
"successCriteria": [
|
|
12
|
+
"analyze-inputs-pi returns a read-only test analysis contract covering scope, risks, and strategy",
|
|
13
|
+
"generate-backend-functional-cases-pi produces structured test cases with BE-<MODULE>-<NNN> IDs under testcase/md/",
|
|
14
|
+
"review-backend-cases-pi returns VERDICT: pass or request-revision with coverage assessment",
|
|
15
|
+
"review-backend-cases-gate-shell blocks pytest generation unless the review verdict is VERDICT: pass",
|
|
16
|
+
"generate-backend-pytest-pi converts reviewed cases into pytest code with 1:1 traceability under testcase/",
|
|
17
|
+
"execute-backend-pytest-shell runs pytest and produces HTML report under reports/",
|
|
18
|
+
"test-retrospect-pi generates retrospective report with A/B/C/D maturity rating under docs/test-reports/",
|
|
19
|
+
"Full traceability from acceptance criteria → functional test case ID → pytest function name"
|
|
20
|
+
],
|
|
21
|
+
"globalConstraints": [
|
|
22
|
+
"Replace every REPLACE/WITH/... placeholder with concrete repo paths before execution; do not leave template placeholders in production DAG JSON.",
|
|
23
|
+
"Do not commit runtime traces under .harness/dag-runs/.",
|
|
24
|
+
"Use only existing executors: pi, shell. Pi writer nodes must set toolProfile=write.",
|
|
25
|
+
"Read-only nodes must not write repository files, including root artifacts/**.",
|
|
26
|
+
"Exclusive writer nodes must stay within declared writeSet.",
|
|
27
|
+
"Every task must explicitly declare executor; defaults.executor is schema-only and not a runtime fallback.",
|
|
28
|
+
"Functional test case IDs must use BE-<MODULE>-<NNN> format.",
|
|
29
|
+
"pytest execution must produce HTML reports under reports/.",
|
|
30
|
+
"Backend-test-dag nodes must maintain traceability from requirements to functional cases to pytest automation.",
|
|
31
|
+
"pytest automation scripts must use test_ filename prefix for pytest discovery.",
|
|
32
|
+
"generate-backend-pytest-pi must only create new test files under testcase/; modifying existing framework files (conftest.py, pytest.ini, pyproject.toml) is forbidden.",
|
|
33
|
+
"review-backend-cases-gate-shell must block pytest generation unless the review verdict is exactly VERDICT: pass.",
|
|
34
|
+
"If a target test filename already exists under testcase/, add a numeric suffix (_01, _02, ...); never overwrite or append to existing files.",
|
|
35
|
+
"execute-backend-pytest-shell must not modify test assertions or production code to make tests pass; test failures indicate potential implementation issues and must be reported honestly.",
|
|
36
|
+
"Prompt templates must not ask main session to write artifacts; node output is the artifact and runner archives it under .harness/dag-runs/.",
|
|
37
|
+
"Actual file operation paths must be macOS/Windows compatible; use / only for stable repo refs, JSON/Markdown evidence refs, and glob conventions.",
|
|
38
|
+
"Same-rank exclusive writeSet entries must be disjoint."
|
|
39
|
+
],
|
|
40
|
+
"defaults": {
|
|
41
|
+
"executor": "pi",
|
|
42
|
+
"contextProfile": "slim",
|
|
43
|
+
"skills": [
|
|
44
|
+
"ai-engineering-context"
|
|
45
|
+
],
|
|
46
|
+
"writePolicy": "read-only"
|
|
47
|
+
},
|
|
48
|
+
"skillsByRole": {
|
|
49
|
+
"planner": [
|
|
50
|
+
"loop-agent"
|
|
51
|
+
],
|
|
52
|
+
"scout": [],
|
|
53
|
+
"implementer": [
|
|
54
|
+
"test-driven-development",
|
|
55
|
+
"verification-before-completion"
|
|
56
|
+
],
|
|
57
|
+
"reviewer": [
|
|
58
|
+
"requesting-code-review",
|
|
59
|
+
"code-review-core"
|
|
60
|
+
],
|
|
61
|
+
"verifier": [
|
|
62
|
+
"verification-before-completion",
|
|
63
|
+
"systematic-debugging"
|
|
64
|
+
],
|
|
65
|
+
"closeout": [
|
|
66
|
+
"loop-agent",
|
|
67
|
+
"verification-before-completion"
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
"executorModels": {
|
|
71
|
+
"pi": {
|
|
72
|
+
"LOW": "gpt-5.3-codex-spark",
|
|
73
|
+
"MED": "glm-5.2",
|
|
74
|
+
"HIGH": "gpt-5.5"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"tasks": [
|
|
78
|
+
{
|
|
79
|
+
"id": "analyze-inputs-pi",
|
|
80
|
+
"depends_on": [],
|
|
81
|
+
"complexity": "MED",
|
|
82
|
+
"executor": "pi",
|
|
83
|
+
"role": "planner",
|
|
84
|
+
"writePolicy": "read-only",
|
|
85
|
+
"allowedPaths": [
|
|
86
|
+
"REPLACE/WITH/SOURCE/PATH/**"
|
|
87
|
+
],
|
|
88
|
+
"forbiddenPaths": [
|
|
89
|
+
".harness/**",
|
|
90
|
+
"artifacts/**"
|
|
91
|
+
],
|
|
92
|
+
"outputContract": "Structured Markdown extracting core content from source documents. No file writes.",
|
|
93
|
+
"retryPolicy": {
|
|
94
|
+
"maxAttempts": 3,
|
|
95
|
+
"backoff": "exponential",
|
|
96
|
+
"initialDelayMs": 2000,
|
|
97
|
+
"maxDelayMs": 30000,
|
|
98
|
+
"retryCategories": [
|
|
99
|
+
"timeout",
|
|
100
|
+
"network",
|
|
101
|
+
"rate-limit",
|
|
102
|
+
"unavailable"
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
"subtask_prompt": "Read the task source materials and extract the following structured content for downstream test generation.\n\n## Required Output Sections:\n\n### 1. API Endpoints\nList all API endpoints: Method, Path, Description, Request params, Response format.\n\n### 2. Data Model\nFor each table/collection: fields, types, constraints, descriptions.\n\n### 3. Business Logic\nCore business rules, validation rules, calculation formulas.\n\n### 4. State Transitions\nState machines (e.g. order status: pending → paid → shipped → completed).\n\n### 5. Error Scenarios & Error Codes\nAll error codes, error messages, and when they occur.\n\n### 6. External Dependencies\nThird-party services, databases, message queues. Include timeout settings if documented.\n\n### 7. Acceptance Criteria\nExtract ALL acceptance criteria from 需求.md. Number them AC-001, AC-002, etc. If not explicitly listed, derive from functional requirements.\n\n### 8. Risk Areas\nHigh-risk areas requiring extra test coverage.\n\n## Conditional Sections (include ONLY if mentioned in requirements):\n- Authentication & Authorization: include ONLY if requirements mention auth mechanism (JWT, OAuth2, API Key, etc.)\n- Timeout Handling: include ONLY if requirements mention timeout configuration or degradation strategy\n- Concurrency & Idempotency: include ONLY if requirements mention concurrency, idempotency rules, or locking mechanisms\n- State Transitions: include ONLY if requirements mention business state machines\n- If not mentioned in requirements, do NOT include these sections\n\nThis output will be used directly by downstream nodes. Be thorough and structured.\nRead-only: do not modify code, docs, artifacts, or repository files."
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"id": "generate-backend-functional-cases-pi",
|
|
109
|
+
"depends_on": [
|
|
110
|
+
"analyze-inputs-pi"
|
|
111
|
+
],
|
|
112
|
+
"complexity": "MED",
|
|
113
|
+
"executor": "pi",
|
|
114
|
+
"role": "implementer",
|
|
115
|
+
"toolProfile": "write",
|
|
116
|
+
"writePolicy": "exclusive",
|
|
117
|
+
"writeSet": [
|
|
118
|
+
"testcase/md/**"
|
|
119
|
+
],
|
|
120
|
+
"allowedPaths": [
|
|
121
|
+
"testcase/md/**"
|
|
122
|
+
],
|
|
123
|
+
"forbiddenPaths": [
|
|
124
|
+
".harness/**",
|
|
125
|
+
"artifacts/**"
|
|
126
|
+
],
|
|
127
|
+
"outputContract": "Structured backend functional test cases in Markdown under testcase/md/. Each case uses BE-<MODULE>-<NNN> ID format.",
|
|
128
|
+
"subtask_prompt": "Based on the upstream analyze-inputs-pi output, generate structured backend functional test cases.\n\n## Output Steps (do in order):\n1. First, output a brief summary: how many modules, how many cases planned per module\n2. Then write each test case file under testcase/md/\n\n## Format Rules:\n- Each test case ID: BE-<MODULE>-<NNN> (e.g. BE-ORDER-001)\n- Each file covers one module\n- Case structure: ID, Title, Precondition, Steps, Expected Result\n- Map each case to acceptance criteria (AC-xxx)\n\n## Coverage Requirements:\n- Positive paths: happy path for each acceptance criterion\n- Negative paths: error scenarios (invalid input, not found, state violations)\n- Boundary conditions: empty input, max length, edge values\n\n## Conditional Coverage (include ONLY if mentioned in upstream analysis):\n- State transitions: include ONLY if upstream analyze-inputs-pi mentions state machine\n- Authentication scenarios: include ONLY if upstream analyze-inputs-pi mentions auth mechanism\n- Timeout scenarios: include ONLY if upstream analyze-inputs-pi mentions timeout handling\n- Concurrency scenarios: include ONLY if upstream analyze-inputs-pi mentions concurrency/idempotency rules\n- If not mentioned, do NOT generate these test cases\n\n## Constraints:\n- Stay within writeSet: testcase/md/**\n- Do NOT re-read source documents — use the upstream analyze-inputs-pi output only\n- Do not write root artifacts/**"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "review-backend-cases-pi",
|
|
132
|
+
"depends_on": [
|
|
133
|
+
"generate-backend-functional-cases-pi"
|
|
134
|
+
],
|
|
135
|
+
"complexity": "HIGH",
|
|
136
|
+
"executor": "pi",
|
|
137
|
+
"role": "reviewer",
|
|
138
|
+
"writePolicy": "read-only",
|
|
139
|
+
"allowedPaths": [
|
|
140
|
+
"**"
|
|
141
|
+
],
|
|
142
|
+
"forbiddenPaths": [
|
|
143
|
+
".harness/**",
|
|
144
|
+
"artifacts/**"
|
|
145
|
+
],
|
|
146
|
+
"outputContract": "Plain Markdown whose first non-empty line is VERDICT: pass or VERDICT: request-revision; followed by Findings and Coverage Assessment. No file writes.",
|
|
147
|
+
"retryPolicy": {
|
|
148
|
+
"maxAttempts": 3,
|
|
149
|
+
"backoff": "exponential",
|
|
150
|
+
"initialDelayMs": 2000,
|
|
151
|
+
"maxDelayMs": 30000,
|
|
152
|
+
"retryCategories": [
|
|
153
|
+
"timeout",
|
|
154
|
+
"network",
|
|
155
|
+
"rate-limit",
|
|
156
|
+
"unavailable"
|
|
157
|
+
]
|
|
158
|
+
},
|
|
159
|
+
"subtask_prompt_markdown": "./backend-test-dag.review-cases.prompt.md"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"id": "review-backend-cases-gate-shell",
|
|
163
|
+
"depends_on": [
|
|
164
|
+
"review-backend-cases-pi"
|
|
165
|
+
],
|
|
166
|
+
"complexity": "LOW",
|
|
167
|
+
"executor": "shell",
|
|
168
|
+
"role": "verifier",
|
|
169
|
+
"writePolicy": "read-only",
|
|
170
|
+
"allowedPaths": [
|
|
171
|
+
"**"
|
|
172
|
+
],
|
|
173
|
+
"forbiddenPaths": [
|
|
174
|
+
".harness/**",
|
|
175
|
+
"artifacts/**"
|
|
176
|
+
],
|
|
177
|
+
"outputContract": "Deterministic backend case review gate: exit 0 only when review-backend-cases-pi emits VERDICT: pass.",
|
|
178
|
+
"subtask_prompt": "Deterministic gate: block pytest generation unless backend case review emitted VERDICT: pass.",
|
|
179
|
+
"shell": {
|
|
180
|
+
"commands": [],
|
|
181
|
+
"verdictGate": {
|
|
182
|
+
"fromNodeId": "review-backend-cases-pi",
|
|
183
|
+
"accept": [
|
|
184
|
+
"VERDICT: pass"
|
|
185
|
+
],
|
|
186
|
+
"label": "backend case review",
|
|
187
|
+
"lineMode": "first-verdict-line"
|
|
188
|
+
},
|
|
189
|
+
"cwd": ".",
|
|
190
|
+
"timeoutMs": 60000
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"id": "generate-backend-pytest-pi",
|
|
195
|
+
"depends_on": [
|
|
196
|
+
"review-backend-cases-gate-shell"
|
|
197
|
+
],
|
|
198
|
+
"complexity": "HIGH",
|
|
199
|
+
"executor": "pi",
|
|
200
|
+
"role": "implementer",
|
|
201
|
+
"toolProfile": "write",
|
|
202
|
+
"writePolicy": "exclusive",
|
|
203
|
+
"writeSet": [
|
|
204
|
+
"testcase/**/test_*.py"
|
|
205
|
+
],
|
|
206
|
+
"allowedPaths": [
|
|
207
|
+
"testcase/**/test_*.py"
|
|
208
|
+
],
|
|
209
|
+
"forbiddenPaths": [
|
|
210
|
+
".harness/**",
|
|
211
|
+
"artifacts/**"
|
|
212
|
+
],
|
|
213
|
+
"outputContract": "Pytest test files under testcase/ with 1:1 mapping to functional test case IDs. Summary lists generated files, test function count, and any skipped cases with reasons.",
|
|
214
|
+
"subtask_prompt_markdown": "./backend-test-dag.generate-pytest.prompt.md"
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"id": "execute-backend-pytest-shell",
|
|
218
|
+
"depends_on": [
|
|
219
|
+
"generate-backend-pytest-pi"
|
|
220
|
+
],
|
|
221
|
+
"complexity": "LOW",
|
|
222
|
+
"executor": "shell",
|
|
223
|
+
"role": "verifier",
|
|
224
|
+
"writePolicy": "read-only",
|
|
225
|
+
"allowedPaths": [
|
|
226
|
+
"**"
|
|
227
|
+
],
|
|
228
|
+
"forbiddenPaths": [
|
|
229
|
+
".harness/**",
|
|
230
|
+
"artifacts/**"
|
|
231
|
+
],
|
|
232
|
+
"outputContract": "Archived pytest stdout/stderr with exit codes and HTML report path; no source or test file modifications.",
|
|
233
|
+
"subtask_prompt": "Run pytest for the backend test suite and capture results.",
|
|
234
|
+
"shell": {
|
|
235
|
+
"commands": [
|
|
236
|
+
"python -m pytest testcase/ --html=reports/backend-test-report.html -v"
|
|
237
|
+
],
|
|
238
|
+
"verifyEvidence": {
|
|
239
|
+
"phase": "final",
|
|
240
|
+
"quota": "full",
|
|
241
|
+
"commandSource": "inline",
|
|
242
|
+
"commandCount": 1,
|
|
243
|
+
"commandLabels": [
|
|
244
|
+
"backend pytest execution"
|
|
245
|
+
],
|
|
246
|
+
"finalFullRequired": true
|
|
247
|
+
},
|
|
248
|
+
"cwd": ".",
|
|
249
|
+
"timeoutMs": 300000
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"id": "test-retrospect-pi",
|
|
254
|
+
"depends_on": [
|
|
255
|
+
"execute-backend-pytest-shell"
|
|
256
|
+
],
|
|
257
|
+
"complexity": "MED",
|
|
258
|
+
"executor": "pi",
|
|
259
|
+
"role": "closeout",
|
|
260
|
+
"toolProfile": "write",
|
|
261
|
+
"writePolicy": "exclusive",
|
|
262
|
+
"writeSet": [
|
|
263
|
+
"docs/test-reports/**"
|
|
264
|
+
],
|
|
265
|
+
"allowedPaths": [
|
|
266
|
+
"docs/test-reports/**"
|
|
267
|
+
],
|
|
268
|
+
"forbiddenPaths": [
|
|
269
|
+
".harness/**",
|
|
270
|
+
"artifacts/**"
|
|
271
|
+
],
|
|
272
|
+
"outputContract": "Markdown retrospective report under docs/test-reports/ with coverage summary, review findings, pytest results, and maturity rating (A/B/C/D).",
|
|
273
|
+
"subtask_prompt_markdown": "./backend-test-dag.retrospect.prompt.md"
|
|
274
|
+
}
|
|
275
|
+
]
|
|
276
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Backend Test DAG Retrospect Prompt Template
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Use this prompt for a **test retrospective** node: `executor: "pi"`, `role: "closeout"`, `toolProfile: "write"`, `writePolicy: "exclusive"`. The closeout agent reads upstream review reports and pytest execution results, then generates a retrospective report with an objective maturity rating.
|
|
6
|
+
|
|
7
|
+
Do **not** create a new executor type. This is a standard `executor: pi` writer node.
|
|
8
|
+
|
|
9
|
+
## Recommended DAG Node Shape
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"id": "test-retrospect-pi",
|
|
14
|
+
"depends_on": ["execute-backend-pytest-shell"],
|
|
15
|
+
"complexity": "MED",
|
|
16
|
+
"executor": "pi",
|
|
17
|
+
"role": "closeout",
|
|
18
|
+
"toolProfile": "write",
|
|
19
|
+
"writePolicy": "exclusive",
|
|
20
|
+
"writeSet": ["docs/test-reports/**"],
|
|
21
|
+
"allowedPaths": ["docs/test-reports/**"],
|
|
22
|
+
"forbiddenPaths": [".harness/**", "artifacts/**"],
|
|
23
|
+
"outputContract": "Markdown retrospective report under docs/test-reports/ with coverage summary, review findings, pytest results, and maturity rating (A/B/C/D).",
|
|
24
|
+
"subtask_prompt_markdown": "./backend-test-dag.retrospect.prompt.md"
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Prompt Body
|
|
29
|
+
|
|
30
|
+
You are the Backend Test DAG **test retrospective** agent.
|
|
31
|
+
|
|
32
|
+
Your job is to read upstream outputs (review report + pytest results) and generate a retrospective report with a maturity rating. Write the report under `docs/test-reports/` only. Stay within `writeSet`. Do not write root `artifacts/**`.
|
|
33
|
+
|
|
34
|
+
### Output Steps (do in order)
|
|
35
|
+
|
|
36
|
+
1. First, output the maturity rating on the first line: `Rating: A/B/C/D`
|
|
37
|
+
2. Then write the full report under `docs/test-reports/`
|
|
38
|
+
|
|
39
|
+
### Inputs
|
|
40
|
+
|
|
41
|
+
1. **Review report** — `review-backend-cases-pi` output (VERDICT, findings, coverage assessment).
|
|
42
|
+
2. **Pytest output** — `execute-backend-pytest-shell` stdout/stderr and exit code.
|
|
43
|
+
3. **HTML report** — `reports/backend-test-report.html` (if generated).
|
|
44
|
+
|
|
45
|
+
Do NOT re-read source documents. Use upstream outputs only.
|
|
46
|
+
|
|
47
|
+
### Maturity Rating Criteria
|
|
48
|
+
|
|
49
|
+
| Rating | Coverage | Pass Rate | Review Findings |
|
|
50
|
+
|--------|----------|-----------|-----------------|
|
|
51
|
+
| **A** | 100% acceptance criteria covered | 100% pytest pass | No Critical or Important findings |
|
|
52
|
+
| **B** | ≥80% acceptance criteria covered | ≥90% pytest pass | Only Informational findings |
|
|
53
|
+
| **C** | ≥60% acceptance criteria covered | ≥70% pytest pass | No Critical findings (Important allowed) |
|
|
54
|
+
| **D** | Below C thresholds | Below C thresholds | Or any Critical finding unresolved |
|
|
55
|
+
|
|
56
|
+
#### Rating Rules
|
|
57
|
+
|
|
58
|
+
- **Coverage** = (acceptance criteria with ≥1 covering test case) / (total acceptance criteria) × 100%
|
|
59
|
+
- **Pass rate** = (passed pytest functions) / (total non-skipped pytest functions) × 100%
|
|
60
|
+
- If `review-backend-cases-pi` returned `VERDICT: request-revision` and revision was not completed, cap at **D**.
|
|
61
|
+
- If pytest exit code is non-zero and >30% tests failed, cap at **D** regardless of coverage.
|
|
62
|
+
- Skipped tests (`@pytest.mark.skip`) count as "not covered" for pass rate but not as failures.
|
|
63
|
+
|
|
64
|
+
### Report Structure
|
|
65
|
+
|
|
66
|
+
Write the report as a Markdown file named `backend-test-retrospect-<date>.md` under `docs/test-reports/`.
|
|
67
|
+
|
|
68
|
+
```markdown
|
|
69
|
+
# Backend Test Retrospective Report
|
|
70
|
+
|
|
71
|
+
**Date:** <YYYY-MM-DD>
|
|
72
|
+
**Task:** <task-id>
|
|
73
|
+
**Maturity Rating:** <A|B|C|D>
|
|
74
|
+
|
|
75
|
+
## 1. Test Coverage Summary
|
|
76
|
+
|
|
77
|
+
| Metric | Value |
|
|
78
|
+
|--------|-------|
|
|
79
|
+
| Total acceptance criteria | N |
|
|
80
|
+
| Covered by test cases | N (X%) |
|
|
81
|
+
| Total functional test cases | N |
|
|
82
|
+
| Positive path cases | N |
|
|
83
|
+
| Negative path cases | N |
|
|
84
|
+
| Boundary cases | N |
|
|
85
|
+
|
|
86
|
+
## 2. Automation Results
|
|
87
|
+
|
|
88
|
+
| Metric | Value |
|
|
89
|
+
|--------|-------|
|
|
90
|
+
| Total pytest functions | N |
|
|
91
|
+
| Passed | N |
|
|
92
|
+
| Failed | N |
|
|
93
|
+
| Skipped | N |
|
|
94
|
+
| Pass rate | X% |
|
|
95
|
+
| Pytest exit code | N |
|
|
96
|
+
|
|
97
|
+
### Failed Test Analysis
|
|
98
|
+
|
|
99
|
+
| Test Case ID | Function | Failure Reason | Root Cause |
|
|
100
|
+
|--------------|----------|----------------|------------|
|
|
101
|
+
| ... | ... | ... | ... |
|
|
102
|
+
|
|
103
|
+
## 3. Review Findings
|
|
104
|
+
|
|
105
|
+
| Severity | Finding | Status |
|
|
106
|
+
|----------|---------|--------|
|
|
107
|
+
| Critical | ... | Resolved / Unresolved |
|
|
108
|
+
| Important | ... | Resolved / Unresolved |
|
|
109
|
+
| Informational | ... | Resolved / Unresolved |
|
|
110
|
+
|
|
111
|
+
## 4. Maturity Rating Rationale
|
|
112
|
+
|
|
113
|
+
Explain which threshold was met or missed, and why the specific rating was assigned.
|
|
114
|
+
|
|
115
|
+
## 5. Recommendations
|
|
116
|
+
|
|
117
|
+
- Actionable items for improving the rating in the next iteration.
|
|
118
|
+
- Specific gaps to close (uncovered criteria, flaky tests, missing negative paths).
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Output Shape (after rating line)
|
|
122
|
+
|
|
123
|
+
After the mandatory maturity rating line, provide a brief summary paragraph before writing the full report file.
|
|
124
|
+
|
|
125
|
+
Do not include chain-of-thought. Do not write root `artifacts/**`.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Backend Test DAG Review Cases Prompt Template
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Use this prompt for a read-only **backend test case review** node: `executor: "pi"`, `role: "reviewer"`, `writePolicy: "read-only"`. The reviewer audits generated backend functional test cases for completeness, format compliance, and traceability to source requirements. Downstream `generate-backend-pytest-pi` depends on a `VERDICT: pass` to proceed.
|
|
6
|
+
|
|
7
|
+
Do **not** create `executor: reviewer`. Reviewer is a **role** on `executor: pi`.
|
|
8
|
+
|
|
9
|
+
## Recommended DAG Node Shape
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"id": "review-backend-cases-pi",
|
|
14
|
+
"depends_on": ["generate-backend-functional-cases-pi"],
|
|
15
|
+
"complexity": "HIGH",
|
|
16
|
+
"executor": "pi",
|
|
17
|
+
"role": "reviewer",
|
|
18
|
+
"writePolicy": "read-only",
|
|
19
|
+
"allowedPaths": ["**"],
|
|
20
|
+
"forbiddenPaths": [".harness/**", "artifacts/**"],
|
|
21
|
+
"outputContract": "Plain Markdown whose first non-empty line is VERDICT: pass or VERDICT: request-revision; followed by Findings and Coverage Assessment. No file writes.",
|
|
22
|
+
"subtask_prompt_markdown": "./backend-test-dag.review-cases.prompt.md"
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Prompt Body
|
|
27
|
+
|
|
28
|
+
You are the Backend Test DAG **test case reviewer** (read-only).
|
|
29
|
+
|
|
30
|
+
Your job is to audit the generated backend functional test cases for completeness, format compliance, requirement coverage, and traceability. You are **not** an implementer or test generator. Do not edit repository files, including root `artifacts/**`.
|
|
31
|
+
|
|
32
|
+
### Mandatory First Line
|
|
33
|
+
|
|
34
|
+
The **first non-empty line** of your response must be exactly one of:
|
|
35
|
+
|
|
36
|
+
- `VERDICT: pass`
|
|
37
|
+
- `VERDICT: request-revision`
|
|
38
|
+
|
|
39
|
+
No preamble, heading, or blank lines before the verdict line.
|
|
40
|
+
|
|
41
|
+
### Inputs to Review
|
|
42
|
+
|
|
43
|
+
1. **Acceptance criteria** — from upstream `analyze-inputs-pi` output (AC-001, AC-002, ...).
|
|
44
|
+
2. **Generated test cases** — files under `testcase/md/`.
|
|
45
|
+
|
|
46
|
+
Do NOT re-read source documents. Use upstream outputs only.
|
|
47
|
+
|
|
48
|
+
### Review Checklist
|
|
49
|
+
|
|
50
|
+
| Area | Check | Severity if Missing |
|
|
51
|
+
|------|-------|---------------------|
|
|
52
|
+
| **ID format** | Every test case ID matches `BE-<MODULE>-<NNN>` (e.g. `BE-ORDER-001`) | Critical |
|
|
53
|
+
| **Positive path coverage** | Happy-path scenarios for each acceptance criterion | Critical |
|
|
54
|
+
| **Negative path coverage** | Error/exception scenarios (invalid input, not found, state violations) | Important |
|
|
55
|
+
| **Boundary conditions** | Edge cases (empty input, max length, edge values) | Important |
|
|
56
|
+
| **State transitions** | Illegal state changes covered | Important |
|
|
57
|
+
| **Requirement traceability** | Each acceptance criterion (AC-xxx) maps to at least one test case ID | Critical |
|
|
58
|
+
| **Case structure** | Each case has: ID, Title, Precondition, Steps, Expected Result | Important |
|
|
59
|
+
| **No duplicate IDs** | All test case IDs are unique across files | Critical |
|
|
60
|
+
|
|
61
|
+
### Conditional Coverage (check ONLY if mentioned in upstream analysis)
|
|
62
|
+
|
|
63
|
+
- **Authentication coverage**: check ONLY if `analyze-inputs-pi` mentions auth mechanism (JWT, OAuth2, API Key, etc.)
|
|
64
|
+
- **Timeout coverage**: check ONLY if `analyze-inputs-pi` mentions timeout handling or degradation strategy
|
|
65
|
+
- If not mentioned in upstream analysis, do NOT flag as missing
|
|
66
|
+
|
|
67
|
+
### Verdict Rules
|
|
68
|
+
|
|
69
|
+
| Condition | Verdict |
|
|
70
|
+
|-----------|---------|
|
|
71
|
+
| All Critical checks pass, Important checks have no more than 2 findings | `VERDICT: pass` |
|
|
72
|
+
| Any Critical check fails | `VERDICT: request-revision` |
|
|
73
|
+
| More than 2 Important findings | `VERDICT: request-revision` |
|
|
74
|
+
| Only Informational findings | `VERDICT: pass` (with findings listed) |
|
|
75
|
+
|
|
76
|
+
### Output Shape (after verdict line)
|
|
77
|
+
|
|
78
|
+
1. **Coverage Assessment** — table mapping each AC to covering test case IDs (or "uncovered").
|
|
79
|
+
2. **Findings** — bullet list tagged `Critical`, `Important`, or `Informational`.
|
|
80
|
+
3. **Statistics** — total case count, positive/negative/boundary breakdown, module distribution.
|
|
81
|
+
4. **Required revisions** (only when `request-revision`) — numbered items for the upstream generator to fix.
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
## 验收标准
|
|
56
|
+
|
|
57
|
+
TODO
|
|
58
|
+
|
|
59
|
+
## 非目标
|
|
60
|
+
|
|
61
|
+
TODO
|
|
@@ -56,13 +56,13 @@
|
|
|
56
56
|
"dag": {
|
|
57
57
|
"type": "object",
|
|
58
58
|
"additionalProperties": false,
|
|
59
|
-
"properties": {
|
|
60
|
-
"outputLanguage": {
|
|
61
|
-
"enum": ["zh-CN", "en"],
|
|
62
|
-
"description": "DAG agent 节点的默认输出语言。未配置时使用简体中文;代码、命令和机器契约不翻译。",
|
|
63
|
-
"default": "zh-CN"
|
|
64
|
-
},
|
|
65
|
-
"defaultEntry": {
|
|
59
|
+
"properties": {
|
|
60
|
+
"outputLanguage": {
|
|
61
|
+
"enum": ["zh-CN", "en"],
|
|
62
|
+
"description": "DAG agent 节点的默认输出语言。未配置时使用简体中文;代码、命令和机器契约不翻译。",
|
|
63
|
+
"default": "zh-CN"
|
|
64
|
+
},
|
|
65
|
+
"defaultEntry": {
|
|
66
66
|
"enum": ["dag run-task", "run-dag"],
|
|
67
67
|
"description": "默认 DAG 入口,用于任务 DAG 生成或直接 DAG 执行。",
|
|
68
68
|
"default": "dag run-task"
|
|
@@ -122,8 +122,7 @@
|
|
|
122
122
|
"principles": { "type": ["string", "null"], "description": "开发原则文档。" },
|
|
123
123
|
"workflow": { "type": ["string", "null"], "description": "功能工作流文档。" },
|
|
124
124
|
"verificationMatrix": { "type": ["string", "null"], "description": "验证命令矩阵。" },
|
|
125
|
-
"loopAgentHarness": { "type": ["string", "null"], "description": "harness runtime 指南。" }
|
|
126
|
-
"cursorExecutorUsage": { "type": ["string", "null"], "description": "可选 Cursor executor 使用说明。" }
|
|
125
|
+
"loopAgentHarness": { "type": ["string", "null"], "description": "harness runtime 指南。" }
|
|
127
126
|
}
|
|
128
127
|
},
|
|
129
128
|
"artifacts": {
|
|
@@ -176,11 +175,10 @@
|
|
|
176
175
|
},
|
|
177
176
|
"executors": {
|
|
178
177
|
"type": "object",
|
|
179
|
-
"description": "按 executor id
|
|
178
|
+
"description": "按 executor id 分组的执行器配置。受治理 runtime 仅支持 pi;Cursor 仅通过 cursor-prompt sidecar 使用,不得配置在 executors 中。",
|
|
180
179
|
"additionalProperties": { "$ref": "#/$defs/executor" },
|
|
181
180
|
"properties": {
|
|
182
|
-
"pi": { "$ref": "#/$defs/executor" }
|
|
183
|
-
"cursor": { "$ref": "#/$defs/executor" }
|
|
181
|
+
"pi": { "$ref": "#/$defs/executor" }
|
|
184
182
|
}
|
|
185
183
|
}
|
|
186
184
|
},
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"Add depends_on only when a child truly needs upstream output; challenge single-chain topologies during review",
|
|
20
20
|
"Same-rank exclusive writeSet entries must be disjoint",
|
|
21
21
|
"exclusive implementer nodes must use narrow, concrete writeSet paths; never use ** or repo root",
|
|
22
|
-
"
|
|
22
|
+
"Use Pi read-only scouts and Pi writer nodes with toolProfile=write; Cursor is only available through the explicit cursor-prompt sidecar",
|
|
23
23
|
"Read-only nodes must not write root artifacts/**; root artifacts/ is reserved for explicit exclusive write nodes"
|
|
24
24
|
],
|
|
25
25
|
"defaults": {
|
|
@@ -53,11 +53,6 @@
|
|
|
53
53
|
]
|
|
54
54
|
},
|
|
55
55
|
"executorModels": {
|
|
56
|
-
"cursor": {
|
|
57
|
-
"LOW": "composer-2.5",
|
|
58
|
-
"MED": "composer-2.5",
|
|
59
|
-
"HIGH": "gpt-5.5"
|
|
60
|
-
},
|
|
61
56
|
"pi": {
|
|
62
57
|
"LOW": "gpt-5.3-codex-spark",
|
|
63
58
|
"MED": "glm-5.2",
|
|
@@ -15,7 +15,7 @@ bash scripts-local/setup-drill-round2-react.sh /tmp/drill-round2-react-target
|
|
|
15
15
|
npm run build
|
|
16
16
|
node scripts-local/prepare-round2-ui-experiment.mjs \
|
|
17
17
|
/tmp/drill-round2-react-target \
|
|
18
|
-
|
|
18
|
+
features/F-2026-001/tasks/FE-001.yaml \
|
|
19
19
|
/tmp/round2-ui-experiment \
|
|
20
20
|
loop-agent
|
|
21
21
|
node scripts-local/build-round2-ui-variants.mjs \
|