@tea-agent/loop-agent 0.12.0 → 0.13.0-beta.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.
Files changed (284) hide show
  1. package/AGENTS.md +155 -153
  2. package/CHANGELOG.md +338 -265
  3. package/README.md +345 -298
  4. package/bin/agent-worker.js +22 -22
  5. package/bin/loop-agent.js +21 -21
  6. package/dist/application/dag/generate-task-dag.js +28 -28
  7. package/dist/application/evaluation/candidate-hash.js +75 -0
  8. package/dist/application/evaluation/candidate.js +52 -0
  9. package/dist/application/evaluation/replay.js +289 -0
  10. package/dist/application/evaluation/types.js +130 -0
  11. package/dist/cli/command-definitions.js +27 -7
  12. package/dist/cli/program.js +8 -4
  13. package/dist/commands/cursor-prompt.js +6 -6
  14. package/dist/commands/eval.js +235 -0
  15. package/dist/commands/init.js +544 -506
  16. package/dist/commands/knowledge.js +129 -31
  17. package/dist/commands/loop-benchmark.js +11 -11
  18. package/dist/commands/pi-reuse-benchmark.js +16 -16
  19. package/dist/executors/pi-sdk-executor.js +38 -24
  20. package/dist/executors/shell-executor.js +34 -2
  21. package/dist/executors/shell-presets.js +20 -0
  22. package/dist/executors/shell-verification.js +7 -0
  23. package/dist/governance/manifest-types.js +4 -0
  24. package/dist/infrastructure/evaluation/candidate-store.js +435 -0
  25. package/dist/infrastructure/evaluation/store.js +40 -0
  26. package/dist/sidecars/cursor-prompt/executor.js +1 -1
  27. package/dist/task/config-types.js +28 -1
  28. package/dist/task/runtime.js +27 -27
  29. package/dist/worker/cli.js +96 -1
  30. package/dist/worker/delivery/package.js +3 -3
  31. package/dist/worker/feature/decision-loader.js +37 -6
  32. package/dist/worker/feature/next-action.js +10 -2
  33. package/dist/worker/feature/ready-plan-projection.js +81 -0
  34. package/dist/worker/feature/reducer.js +2 -1
  35. package/dist/worker/feature/review.js +19 -2
  36. package/dist/worker/feature/run.js +27 -2
  37. package/dist/worker/follow-up/approve.js +5 -2
  38. package/dist/worker/follow-up/factory.js +1 -1
  39. package/dist/worker/observability/read-model.js +246 -41
  40. package/dist/worker/observe/routes.js +173 -15
  41. package/dist/worker/observe/spec-evidence.js +281 -0
  42. package/dist/worker/observe/static/api.js +46 -27
  43. package/dist/worker/observe/static/app.js +150 -150
  44. package/dist/worker/observe/static/constants.js +148 -148
  45. package/dist/worker/observe/static/copy.js +67 -67
  46. package/dist/worker/observe/static/dag-helpers.js +172 -172
  47. package/dist/worker/observe/static/dag-layout.d.ts +31 -31
  48. package/dist/worker/observe/static/dag-layout.js +83 -83
  49. package/dist/worker/observe/static/dag-model.js +72 -72
  50. package/dist/worker/observe/static/dom.js +61 -61
  51. package/dist/worker/observe/static/format-pool.js +67 -67
  52. package/dist/worker/observe/static/format.js +292 -292
  53. package/dist/worker/observe/static/index.html +308 -308
  54. package/dist/worker/observe/static/kpi.js +94 -94
  55. package/dist/worker/observe/static/relations.js +133 -128
  56. package/dist/worker/observe/static/router.js +93 -85
  57. package/dist/worker/observe/static/run-processing.js +148 -148
  58. package/dist/worker/observe/static/shell-chrome.js +68 -68
  59. package/dist/worker/observe/static/state.js +253 -253
  60. package/dist/worker/observe/static/styles.css +1902 -1890
  61. package/dist/worker/observe/static/views/batch.js +227 -226
  62. package/dist/worker/observe/static/views/dag-graph.js +172 -172
  63. package/dist/worker/observe/static/views/dag-inspector.js +607 -477
  64. package/dist/worker/observe/static/views/dag.js +362 -362
  65. package/dist/worker/observe/static/views/dashboard.js +445 -442
  66. package/dist/worker/observe/static/views/failures.js +143 -143
  67. package/dist/worker/observe/static/views/feature.js +492 -453
  68. package/dist/worker/observe/static/views/pool.js +350 -347
  69. package/dist/worker/observe/static/views/run.js +453 -453
  70. package/dist/worker/observe/static/views/session-timeline.js +205 -205
  71. package/dist/worker/observe/static/views/shell.js +7 -7
  72. package/dist/worker/observe/static/views/task.js +314 -260
  73. package/dist/worker/observe/static/views/timeline.js +163 -163
  74. package/dist/worker/pool/doctor.js +165 -0
  75. package/dist/worker/pool/migrate-state.js +303 -0
  76. package/dist/worker/pool/run-store.js +205 -17
  77. package/dist/worker/pool/types.js +17 -1
  78. package/dist/worker/pool/validation.js +100 -15
  79. package/dist/worker/report/morning-report.js +12 -2
  80. package/dist/worker/runner/run-ready.js +41 -26
  81. package/dist/worker/task-graph/ready-planner.js +136 -0
  82. package/dist/workflows/dag/backend-test-analysis-contract.js +120 -0
  83. package/dist/workflows/dag/canvas-observer.js +275 -275
  84. package/dist/workflows/dag/convergence/controller.js +16 -8
  85. package/dist/workflows/dag/dynamic-runtime/map.js +90 -2
  86. package/dist/workflows/dag/failure-routing.js +12 -1
  87. package/dist/workflows/dag/init-hybrid.js +2404 -360
  88. package/dist/workflows/dag/node-execution.js +9 -0
  89. package/dist/workflows/dag/prompt.js +9 -0
  90. package/dist/workflows/dag/report.js +35 -1
  91. package/dist/workflows/dag/runner.js +28 -2
  92. package/dist/workflows/dag/task-demand-routing.js +383 -0
  93. package/dist/workflows/dag/types.js +51 -13
  94. package/dist/workflows/dag/upstream-artifacts.js +1 -0
  95. package/dist/workflows/dag/validate.js +59 -1
  96. package/docs/README.md +106 -104
  97. package/docs/agent-dag-recovery-playbook.md +195 -184
  98. package/docs/agent-dag-runner.md +67 -67
  99. package/docs/architecture/README.md +26 -26
  100. package/docs/architecture/dag-execution.md +140 -140
  101. package/docs/architecture/evolution.md +54 -53
  102. package/docs/architecture/facts-and-state.md +71 -58
  103. package/docs/architecture/runtime-boundaries.md +191 -191
  104. package/docs/architecture/system-overview.md +93 -93
  105. package/docs/architecture/worker-and-feature.md +85 -81
  106. package/docs/cursor-prompt-sidecar.md +36 -36
  107. package/docs/decisions/README.md +18 -15
  108. package/docs/design/README.md +167 -77
  109. package/docs/development-principles.md +73 -73
  110. package/docs/exec-plans/README.md +6 -6
  111. package/docs/exec-plans/active/README.md +15 -9
  112. package/docs/exec-plans/completed/README.md +85 -73
  113. package/docs/feature-workflow.md +389 -261
  114. package/docs/harness-methodology-debugging.md +153 -153
  115. package/docs/harness-methodology-tdd.md +130 -130
  116. package/docs/harness-methodology-verification.md +27 -27
  117. package/docs/init-surface.manifest.json +289 -280
  118. package/docs/loop-agent-harness.md +142 -130
  119. package/docs/production-readiness.md +96 -96
  120. package/docs/progress/README.md +64 -54
  121. package/docs/reports/README.md +117 -94
  122. package/docs/skills/README.md +7 -7
  123. package/docs/skills/vetted-skill-registry.md +29 -27
  124. package/docs/templates/adr.md +60 -60
  125. package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -94
  126. package/docs/templates/agent-dag-decision-envelope.schema.json +213 -213
  127. package/docs/templates/agent-dag-decision-gate-dogfood-report.md +117 -117
  128. package/docs/templates/agent-dag-decision-gate.prompt.md +246 -246
  129. package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -98
  130. package/docs/templates/agent-dag-report.schema.json +473 -473
  131. package/docs/templates/agent-dag-review-verdict.prompt.md +68 -68
  132. package/docs/templates/agent-dag.base.json +190 -190
  133. package/docs/templates/agent-dag.final-verification.json +185 -185
  134. package/docs/templates/agent-dag.schema.json +411 -383
  135. package/docs/templates/agent-dag.supervised-implementation.json +501 -501
  136. package/docs/templates/backend-test-analysis.schema.json +44 -0
  137. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +202 -139
  138. package/docs/templates/backend-test-dag.json +311 -276
  139. package/docs/templates/backend-test-dag.retrospect.prompt.md +125 -125
  140. package/docs/templates/backend-test-dag.review-cases.prompt.md +81 -81
  141. package/docs/templates/exec-plan.md +64 -64
  142. package/docs/templates/feature-spec.md +53 -53
  143. package/docs/templates/frontend-design-contract.md +42 -33
  144. package/docs/templates/frontend-task-constraints.md +35 -25
  145. package/docs/templates/frontend-task-requirement.md +70 -61
  146. package/docs/templates/frontend-test-dag.generate-cases.prompt.md +5 -0
  147. package/docs/templates/frontend-test-dag.json +23 -0
  148. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +3 -0
  149. package/docs/templates/frontend-test-dag.retrospect.prompt.md +3 -0
  150. package/docs/templates/frontend-test-dag.review-cases.prompt.md +3 -0
  151. package/docs/templates/frontend-test-dag.review-execution.prompt.md +3 -0
  152. package/docs/templates/harness.schema.json +221 -221
  153. package/docs/templates/hybrid-dag.json +188 -188
  154. package/docs/templates/init-evolution-review.md +35 -35
  155. package/docs/templates/interactive-ui-round2-experiment.md +66 -66
  156. package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -0
  157. package/docs/templates/knowledge-sync-dag.json +178 -0
  158. package/docs/templates/knowledge-sync-draft.schema.json +71 -0
  159. package/docs/templates/product-line/AGENTS.md +8 -8
  160. package/docs/templates/product-line/README.md +9 -9
  161. package/docs/templates/product-line/acceptance.yaml +14 -14
  162. package/docs/templates/product-line/closeout.yaml +9 -9
  163. package/docs/templates/product-line/design.md +13 -13
  164. package/docs/templates/product-line/links.md +10 -10
  165. package/docs/templates/product-line/requirement.md +17 -17
  166. package/docs/templates/product-line/task-graph.yaml +15 -15
  167. package/docs/templates/product-line/task.yaml +64 -64
  168. package/docs/templates/product-line/test-plan.md +7 -7
  169. package/docs/templates/production-readiness-checklist.md +57 -57
  170. package/docs/templates/progress-log.md +17 -17
  171. package/docs/templates/project-start-checklist.md +9 -9
  172. package/docs/templates/qa-report.md +48 -48
  173. package/docs/templates/sprint-contract.md +29 -29
  174. package/docs/templates/worker-dogfood-evidence.md +80 -80
  175. package/docs/templates/worker-dogfood-setup.md +68 -68
  176. package/docs/verification-matrix.md +70 -66
  177. package/examples/decision-gate-agent-dag.json +177 -177
  178. package/examples/example-dag.json +46 -46
  179. package/examples/hybrid-loop-agent-dag.json +189 -189
  180. package/harness.json +66 -66
  181. package/package.json +88 -46
  182. package/scripts/check-product-line-docs.sh +29 -29
  183. package/scripts/check-task-pool-root.sh +32 -32
  184. package/scripts/kb-bootstrap-init-skeleton.sh +240 -0
  185. package/scripts/kb-graph-incremental-prepare.mjs +386 -0
  186. package/scripts/kb-graph-incremental-prepare.sh +5 -0
  187. package/scripts/kb-graph-materialize.mjs +105 -0
  188. package/scripts/kb-graph-materialize.sh +4 -0
  189. package/scripts/kb-graph-promote.mjs +164 -0
  190. package/scripts/kb-graph-promote.sh +4 -0
  191. package/scripts/kb-query.mjs +554 -0
  192. package/scripts/kb-query.sh +5 -0
  193. package/skills/agent-worker/SKILL.md +39 -37
  194. package/skills/agent-worker/references/agent-worker-operator.md +60 -43
  195. package/skills/ai-engineering-context/SKILL.md +48 -48
  196. package/skills/analyze-product-dependencies/SKILL.md +67 -0
  197. package/skills/analyze-product-dependencies/agents/openai.yaml +4 -0
  198. package/skills/analyze-product-dependencies/references/api-documentation-schema.md +30 -0
  199. package/skills/analyze-product-dependencies/references/dependency-analysis-schema.md +28 -0
  200. package/skills/analyze-product-dependencies/references/example.md +76 -0
  201. package/skills/analyze-product-dependencies/references/forward-test-cases.md +35 -0
  202. package/skills/analyze-product-dependencies/references/input-contract.md +11 -0
  203. package/skills/analyze-product-dependencies/references/scouting-rules.md +61 -0
  204. package/skills/analyze-product-dependencies/scripts/test-validators.mjs +267 -0
  205. package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +101 -0
  206. package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +142 -0
  207. package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +76 -0
  208. package/skills/analyze-product-dependencies/scripts/validation-helpers.mjs +146 -0
  209. package/skills/analyze-product-requirements/SKILL.md +90 -0
  210. package/skills/analyze-product-requirements/agents/openai.yaml +4 -0
  211. package/skills/analyze-product-requirements/references/acceptance-criteria.md +91 -0
  212. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +56 -0
  213. package/skills/analyze-product-requirements/references/example.md +86 -0
  214. package/skills/analyze-product-requirements/references/forward-test-cases.md +66 -0
  215. package/skills/analyze-product-requirements/references/product-analysis-schema.md +32 -0
  216. package/skills/analyze-product-requirements/references/product-requirement-schema.md +33 -0
  217. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +35 -0
  218. package/skills/analyze-product-requirements/scripts/test-validators.mjs +193 -0
  219. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +69 -0
  220. package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +97 -0
  221. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +98 -0
  222. package/skills/analyze-product-requirements/scripts/validation-helpers.mjs +156 -0
  223. package/skills/code-review-core/SKILL.md +20 -20
  224. package/skills/codebase-scout/SKILL.md +19 -19
  225. package/skills/frontend-design-review/SKILL.md +66 -59
  226. package/skills/frontend-design-review/references/review-checklist.md +58 -37
  227. package/skills/frontend-implementation/SKILL.md +47 -51
  228. package/skills/frontend-implementation/references/code-standards.md +32 -34
  229. package/skills/frontend-implementation/references/design-spec.md +46 -46
  230. package/skills/frontend-implementation/references/node-contracts.md +76 -32
  231. package/skills/frontend-review/SKILL.md +59 -53
  232. package/skills/frontend-review/references/review-findings.md +47 -42
  233. package/skills/frontend-verification/SKILL.md +53 -40
  234. package/skills/frontend-verification/references/verification-checklist.md +68 -56
  235. package/skills/grill-me/SKILL.md +10 -10
  236. package/skills/grill-with-docs/SKILL.md +88 -88
  237. package/skills/grill-with-docs/adr-format.md +47 -47
  238. package/skills/grill-with-docs/context-format.md +60 -60
  239. package/skills/init-capability-evolution/SKILL.md +70 -70
  240. package/skills/loop-agent/SKILL.md +151 -151
  241. package/skills/loop-agent/references/README.md +67 -67
  242. package/skills/loop-agent/references/command-reference.md +505 -452
  243. package/skills/loop-agent/references/docs-converge.md +126 -126
  244. package/skills/loop-agent/references/harness-policy.md +263 -263
  245. package/skills/loop-agent/references/hybrid-dag.md +238 -233
  246. package/skills/loop-agent/references/learned/README.md +21 -21
  247. package/skills/loop-agent/references/long-running-loop.md +57 -57
  248. package/skills/loop-agent/references/model-routing.md +36 -36
  249. package/skills/loop-agent/references/multi-worktree.md +54 -54
  250. package/skills/loop-agent/references/one-shot-runs.md +85 -85
  251. package/skills/loop-agent/references/orchestrator-and-interventions.md +169 -169
  252. package/skills/loop-agent/references/pi-prompt.md +23 -23
  253. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +84 -84
  254. package/skills/loop-agent/references/post-implementation-and-patterns.md +44 -44
  255. package/skills/loop-agent/references/task-workflow.md +89 -89
  256. package/skills/loop-agent/references/verification-and-failure-handling.md +139 -139
  257. package/skills/playwright-cli/SKILL.md +420 -0
  258. package/skills/playwright-cli/references/element-attributes.md +23 -0
  259. package/skills/playwright-cli/references/playwright-tests.md +39 -0
  260. package/skills/playwright-cli/references/request-mocking.md +87 -0
  261. package/skills/playwright-cli/references/running-code.md +241 -0
  262. package/skills/playwright-cli/references/session-management.md +225 -0
  263. package/skills/playwright-cli/references/storage-state.md +275 -0
  264. package/skills/playwright-cli/references/test-generation.md +433 -0
  265. package/skills/playwright-cli/references/tracing.md +139 -0
  266. package/skills/playwright-cli/references/video-recording.md +143 -0
  267. package/skills/playwright-cli-case-generator/SKILL.md +74 -0
  268. package/skills/requesting-code-review/SKILL.md +101 -101
  269. package/skills/requesting-code-review/code-reviewer.md +168 -168
  270. package/skills/systematic-debugging/CREATION-LOG.md +119 -119
  271. package/skills/systematic-debugging/SKILL.md +296 -296
  272. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
  273. package/skills/systematic-debugging/condition-based-waiting.md +115 -115
  274. package/skills/systematic-debugging/defense-in-depth.md +122 -122
  275. package/skills/systematic-debugging/find-polluter.sh +63 -63
  276. package/skills/systematic-debugging/root-cause-tracing.md +169 -169
  277. package/skills/systematic-debugging/test-academic.md +14 -14
  278. package/skills/systematic-debugging/test-pressure-1.md +58 -58
  279. package/skills/systematic-debugging/test-pressure-2.md +68 -68
  280. package/skills/systematic-debugging/test-pressure-3.md +69 -69
  281. package/skills/test-driven-development/SKILL.md +20 -20
  282. package/skills/using-git-worktrees/SKILL.md +215 -215
  283. package/skills/verification-before-completion/SKILL.md +154 -154
  284. package/skills/webapp-testing/SKILL.md +19 -19
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://tea-agent.dev/schemas/backend-test-analysis-v1.json",
4
+ "title": "Backend Test Analysis v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "sourceBinding", "acceptanceCriteria", "endpoints", "dataModels", "businessRules", "stateTransitions", "boundaryConstraints", "externalDependencies", "risks", "evidenceGaps"],
8
+ "properties": {
9
+ "schemaVersion": { "const": 1 },
10
+ "sourceBinding": {
11
+ "type": "object", "additionalProperties": false,
12
+ "required": ["taskId", "requirementPath", "requirementSha256", "referencePaths", "requirementIds"],
13
+ "properties": {
14
+ "taskId": { "type": "string", "minLength": 1 },
15
+ "requirementPath": { "type": "string", "minLength": 1 },
16
+ "requirementSha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
17
+ "referencePaths": { "type": "array", "items": { "type": "string", "minLength": 1 } },
18
+ "requirementIds": { "type": "array", "items": { "type": "string", "pattern": "^(REQ|BR|AC)-[A-Z0-9]+(-[A-Z0-9]+)*$" } }
19
+ }
20
+ },
21
+ "acceptanceCriteria": { "type": "array", "items": { "$ref": "#/$defs/acceptanceCriterion" } },
22
+ "endpoints": { "type": "array", "items": { "$ref": "#/$defs/endpoint" } },
23
+ "dataModels": { "type": "array", "items": { "$ref": "#/$defs/evidencedDescription" } },
24
+ "businessRules": { "type": "array", "items": { "$ref": "#/$defs/businessRule" } },
25
+ "stateTransitions": { "type": "array", "items": { "$ref": "#/$defs/stateTransition" } },
26
+ "boundaryConstraints": { "type": "array", "items": { "$ref": "#/$defs/boundaryConstraint" } },
27
+ "externalDependencies": { "type": "array", "items": { "$ref": "#/$defs/optionalEvidenceDescription" } },
28
+ "risks": { "type": "array", "items": { "$ref": "#/$defs/optionalEvidenceDescription" } },
29
+ "evidenceGaps": { "type": "array", "items": { "$ref": "#/$defs/evidenceGap" } }
30
+ },
31
+ "$defs": {
32
+ "sourceRef": { "type": "string", "minLength": 1 },
33
+ "field": { "type": "object", "additionalProperties": false, "required": ["name"], "properties": { "name": { "type": "string", "minLength": 1 }, "type": { "type": "string", "minLength": 1 }, "required": { "type": "boolean" }, "description": { "type": "string" } } },
34
+ "errorCase": { "type": "object", "additionalProperties": false, "required": ["description"], "properties": { "status": { "type": "integer", "minimum": 400, "maximum": 599 }, "code": { "type": "string", "minLength": 1 }, "messageField": { "type": "string", "minLength": 1 }, "description": { "type": "string", "minLength": 1 } } },
35
+ "acceptanceCriterion": { "type": "object", "additionalProperties": false, "required": ["id", "text", "sourceRef"], "properties": { "id": { "type": "string", "pattern": "^AC-[A-Z0-9]+(-[A-Z0-9]+)*$" }, "text": { "type": "string", "minLength": 1 }, "sourceRef": { "$ref": "#/$defs/sourceRef" } } },
36
+ "endpoint": { "type": "object", "additionalProperties": false, "required": ["id", "method", "path", "requestFields", "responseFields", "successStatuses", "errorCases"], "properties": { "id": { "type": "string", "minLength": 1 }, "method": { "enum": ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"] }, "path": { "type": "string", "pattern": "^/" }, "requestFields": { "type": "array", "items": { "$ref": "#/$defs/field" } }, "responseFields": { "type": "array", "items": { "$ref": "#/$defs/field" } }, "successStatuses": { "type": "array", "items": { "type": "integer", "minimum": 100, "maximum": 399 } }, "errorCases": { "type": "array", "items": { "$ref": "#/$defs/errorCase" } } } },
37
+ "evidencedDescription": { "type": "object", "additionalProperties": false, "required": ["id", "description", "sourceRef"], "properties": { "id": { "type": "string", "minLength": 1 }, "description": { "type": "string", "minLength": 1 }, "sourceRef": { "$ref": "#/$defs/sourceRef" } } },
38
+ "businessRule": { "type": "object", "additionalProperties": false, "required": ["id", "text", "sourceRef"], "properties": { "id": { "type": "string", "minLength": 1 }, "text": { "type": "string", "minLength": 1 }, "sourceRef": { "$ref": "#/$defs/sourceRef" } } },
39
+ "stateTransition": { "type": "object", "additionalProperties": false, "required": ["from", "to", "trigger", "sourceRef"], "properties": { "from": { "type": "string", "minLength": 1 }, "to": { "type": "string", "minLength": 1 }, "trigger": { "type": "string", "minLength": 1 }, "sourceRef": { "$ref": "#/$defs/sourceRef" } } },
40
+ "boundaryConstraint": { "type": "object", "additionalProperties": false, "required": ["field", "constraint", "sourceRef"], "properties": { "field": { "type": "string", "minLength": 1 }, "constraint": { "type": "string", "minLength": 1 }, "sourceRef": { "$ref": "#/$defs/sourceRef" } } },
41
+ "optionalEvidenceDescription": { "type": "object", "additionalProperties": false, "required": ["description"], "properties": { "name": { "type": "string", "minLength": 1 }, "description": { "type": "string", "minLength": 1 }, "sourceRef": { "$ref": "#/$defs/sourceRef" } } },
42
+ "evidenceGap": { "type": "object", "additionalProperties": false, "required": ["description"], "properties": { "description": { "type": "string", "minLength": 1 }, "requirementId": { "type": "string" }, "sourceRef": { "$ref": "#/$defs/sourceRef" } } }
43
+ }
44
+ }
@@ -1,139 +1,202 @@
1
- # Backend Test DAG Generate Pytest Prompt Template
2
-
3
- ## Purpose
4
-
5
- Use this prompt for a **pytest code generation** node: `executor: "pi"`, `role: "implementer"`, `toolProfile: "write"`, `writePolicy: "exclusive"`. The implementer converts reviewed backend functional test cases into pytest automation code with 1:1 traceability.
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": "generate-backend-pytest-pi",
14
- "depends_on": ["review-backend-cases-gate-shell"],
15
- "complexity": "HIGH",
16
- "executor": "pi",
17
- "role": "implementer",
18
- "toolProfile": "write",
19
- "writePolicy": "exclusive",
20
- "writeSet": ["testcase/**/test_*.py"],
21
- "allowedPaths": ["testcase/**/test_*.py"],
22
- "forbiddenPaths": [".harness/**", "artifacts/**"],
23
- "outputContract": "Pytest test files under tests/backend/ with 1:1 mapping to functional test case IDs. Summary lists generated files, test function count, and any skipped cases with reasons.",
24
- "subtask_prompt_markdown": "./backend-test-dag.generate-pytest.prompt.md"
25
- }
26
- ```
27
-
28
- ## Prompt Body
29
-
30
- You are the Backend Test DAG **pytest code generator**.
31
-
32
- Your job is to convert reviewed test cases under `testcase/md/` into pytest automation code. Write test files under `testcase/` only. Stay within `writeSet`. Do not write root `artifacts/**`.
33
-
34
- ### Output Steps (do in order)
35
-
36
- 1. First, output a brief summary: how many files, how many test functions planned
37
- 2. Then write each test file under `testcase/`
38
-
39
- ### Inputs
40
-
41
- 1. **Reviewed test cases** — files under `testcase/md/` (approved by `review-backend-cases-pi`).
42
- 2. **Target project conventions** — read `conftest.py`, `pytest.ini` / `pyproject.toml` to understand conventions, but do NOT modify them.
43
-
44
- Do NOT re-read source documents. Use the reviewed cases only.
45
-
46
- ### Conversion Rules
47
-
48
- #### File Naming
49
-
50
- - Every test file must start with `test_` prefix (e.g. `test_order.py`, `test_user_api.py`)
51
- - pytest collects tests from files matching `test_*.py` or `*_test.py` — use `test_` prefix exclusively
52
- - Never create test files without the `test_` prefix
53
-
54
- #### Write Boundary
55
-
56
- - Only **create new** test script files under `testcase/`
57
- - Do NOT modify existing files: `conftest.py`, `pytest.ini`, `pyproject.toml`, `setup.cfg`, `__init__.py`, or any other framework/config file
58
- - Reuse existing fixtures; if required fixtures do not exist, report the gap instead of creating or modifying framework files
59
- - Read existing framework files to understand conventions, but treat them as immutable
60
-
61
- #### Naming Conflict Resolution
62
-
63
- - If a file with the target name already exists under `testcase/`, add a numeric suffix: `test_order.py` → `test_order_01.py` → `test_order_02.py`
64
- - Never overwrite or append to existing files — each test script must be a standalone file
65
- - Check for existing files before writing; if `test_<module>.py` exists, use `test_<module>_01.py`
66
-
67
- #### 1:1 Traceability
68
-
69
- Every functional test case ID (`BE-<MODULE>-<NNN>`) must map to exactly one pytest function:
70
-
71
- ```python
72
- # testcase/md/BE-ORDER-001 → testcase/test_order.py
73
- def test_BE_ORDER_001_create_order_with_valid_data():
74
- """BE-ORDER-001: Create order with valid request body."""
75
- ...
76
- ```
77
-
78
- - Function name: `test_<CASE_ID_with_underscores>` (e.g. `test_BE_ORDER_001_...`)
79
- - Docstring first line: `<CASE_ID>: <Case Title>`
80
-
81
- #### File Organization
82
-
83
- - All test files go under `testcase/` directory in the host project root
84
- - Group test files by MODULE segment: `BE-ORDER-*` → `testcase/test_order.py`, `BE-USER-*` → `testcase/test_user.py`
85
- - Follow existing project conventions for import style, fixture scope
86
-
87
- #### Fixture Strategy
88
-
89
- - Reuse existing project fixtures from `conftest.py` when available
90
- - Do not create or modify fixture/configuration files in this node
91
- - Prefer `@pytest.fixture(scope="function")` for test isolation
92
- - Use `@pytest.mark.parametrize` for boundary condition cases with multiple inputs
93
-
94
- #### Test Integrity
95
-
96
- - Tests verify implementation correctness — if a test fails, the implementation likely has a bug, not the test
97
- - Do NOT weaken assertions, remove test cases, or modify test logic to make tests pass
98
- - Do NOT add workarounds, skips, or try/except blocks to hide failures without explicit justification
99
- - Report all failures honestly in the output; the downstream `execute-backend-pytest-shell` node captures exit codes and stdout/stderr as-is
100
-
101
- #### Assertions
102
-
103
- - Use `assert` statements, not `unittest` assertions
104
- - Assert specific values, not just "no exception"
105
- - For API tests: assert status code, response body keys, and specific field values
106
- - For database tests: assert record state after operation
107
-
108
- #### Conditional Test Implementation (include ONLY if test cases exist)
109
-
110
- - **Authentication tests**: implement ONLY if `testcase/md/` contains auth-related cases
111
- - Use `@pytest.mark.auth` marker
112
- - Test no token, expired token, invalid token, insufficient permissions, cross-user access
113
- - **Timeout tests**: implement ONLY if `testcase/md/` contains timeout-related cases
114
- - Use `@pytest.mark.timeout` marker
115
- - Use `unittest.mock.patch` or `pytest-mock` to simulate slow responses
116
- - If no such cases exist in the reviewed test cases, do NOT add these tests
117
-
118
- #### Markers
119
-
120
- - `@pytest.mark.positive` — happy path cases
121
- - `@pytest.mark.negative` error/exception cases
122
- - `@pytest.mark.boundary` edge cases
123
- - `@pytest.mark.<MODULE>` module-specific marker (e.g. `@pytest.mark.order`)
124
-
125
- #### Skip Policy
126
-
127
- If a test case cannot be automated (requires external service not mockable, requires manual verification), add it with `@pytest.mark.skip(reason="...")` and document the reason. Do not omit the function — traceability requires it exists.
128
-
129
- ### Output Shape (after summary line)
130
-
131
- After the mandatory summary line, provide:
132
-
133
- 1. **Generated Files** — list of files written under `tests/backend/`.
134
- 2. **Function Mapping Table** `| Test Case ID | Pytest Function | File | Marker |`.
135
- 3. **Skipped Cases** if any, list with reason.
136
- 4. **Conventions Observed** note project fixtures/config discovered and followed.
137
- 5. **Residual Risks** cases that may need manual verification or environment setup.
138
-
139
- Do not include chain-of-thought. Do not write root `artifacts/**`.
1
+ # Backend Test DAG Generate Pytest Prompt Template
2
+
3
+ ## Purpose
4
+
5
+ Use this prompt for a **pytest code generation** node: `executor: "pi"`, `role: "implementer"`, `toolProfile: "write"`, `writePolicy: "exclusive"`. The implementer converts reviewed backend functional test cases into pytest automation code with 1:1 traceability.
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": "generate-backend-pytest-pi",
14
+ "depends_on": ["review-backend-cases-gate-shell"],
15
+ "complexity": "HIGH",
16
+ "executor": "pi",
17
+ "role": "implementer",
18
+ "toolProfile": "write",
19
+ "writePolicy": "exclusive",
20
+ "writeSet": ["testcase/**/test_*.py", "testcase/**/helpers/**", "testcase/**/factories/**"],
21
+ "allowedPaths": ["**"],
22
+ "forbiddenPaths": [".harness/**", "artifacts/**"],
23
+ "outputContract": "Pytest test files under testcase/ with 1:1 mapping to functional test case IDs; optional helpers/factories. Summary lists generated files, test function count, and any skipped cases with reasons.",
24
+ "subtask_prompt_markdown": "./backend-test-dag.generate-pytest.prompt.md"
25
+ }
26
+ ```
27
+
28
+ ## Prompt Body
29
+
30
+ You are the Backend Test DAG **pytest code generator**.
31
+
32
+ Your job is to convert reviewed test cases under `testcase/md/` into pytest automation code. Write test files under `testcase/` only. Stay within `writeSet`. Do not write root `artifacts/**`.
33
+
34
+ ### Output Steps (do in order)
35
+
36
+ 1. First, output a brief summary: how many files, how many test functions planned
37
+ 2. Then write each test file under `testcase/`
38
+
39
+ ### Inputs
40
+
41
+ 1. **Reviewed test cases** — files under `testcase/md/` (approved by `review-backend-cases-pi`).
42
+ 2. **Target project conventions** — read `conftest.py`, `pytest.ini` / `pyproject.toml` to understand conventions, but do NOT modify them.
43
+
44
+ Do NOT re-read source documents. Use the reviewed cases only.
45
+
46
+ ### Conversion Rules
47
+
48
+ #### File Naming
49
+
50
+ - Every test file must start with `test_` prefix (e.g. `test_order.py`, `test_user_api.py`)
51
+ - pytest collects tests from files matching `test_*.py` or `*_test.py` — use `test_` prefix exclusively
52
+ - Never create test files without the `test_` prefix
53
+
54
+ #### Write Boundary
55
+
56
+ - Only **create new** files under writeSet:
57
+ - `testcase/**/test_*.py`
58
+ - `testcase/**/helpers/**` (optional pure helpers)
59
+ - `testcase/**/factories/**` (optional test data factories)
60
+ - Do NOT modify existing files: `conftest.py`, `pytest.ini`, `pyproject.toml`, `setup.cfg`, `__init__.py`, or any other framework/config file
61
+ - Reuse existing fixtures; if required helpers are missing, create NEW helper/factory modules under the writeSet paths above — never edit root conftest
62
+ - Read existing framework files to understand conventions, but treat them as immutable
63
+ - Do NOT write production code, `.env`, secrets, or credential files
64
+
65
+ #### Naming Conflict Resolution
66
+
67
+ - If a file with the target name already exists under `testcase/`, add a numeric suffix: `test_order.py` → `test_order_01.py` → `test_order_02.py`
68
+ - Never overwrite or append to existing files — each test script must be a standalone file
69
+ - Check for existing files before writing; if `test_<module>.py` exists, use `test_<module>_01.py`
70
+
71
+ #### 1:1 Traceability
72
+
73
+ Every functional test case ID (`BE-<MODULE>-<NNN>`) must map to exactly one pytest function:
74
+
75
+ ```python
76
+ # testcase/md/BE-ORDER-001 → testcase/test_order.py
77
+ def test_BE_ORDER_001_create_order_with_valid_data():
78
+ """BE-ORDER-001: Create order with valid request body."""
79
+ ...
80
+ ```
81
+
82
+ - Function name: `test_<CASE_ID_with_underscores>` (e.g. `test_BE_ORDER_001_...`)
83
+ - Docstring first line: `<CASE_ID>: <Case Title>`
84
+
85
+ #### File Organization
86
+
87
+ - All test files go under `testcase/` directory in the host project root
88
+ - Group test files by MODULE segment: `BE-ORDER-*` → `testcase/test_order.py`, `BE-USER-*` → `testcase/test_user.py`
89
+ - Follow existing project conventions for import style, fixture scope
90
+
91
+ #### Fixture Strategy
92
+
93
+ - Reuse existing project fixtures from `conftest.py` when available (read-only)
94
+ - Do not create or modify root fixture/configuration files (`conftest.py`, pytest.ini, …)
95
+ - Optional NEW helpers/factories may live under `testcase/**/helpers/**` or `testcase/**/factories/**` only
96
+ - Prefer `@pytest.fixture(scope="function")` for test isolation
97
+ - Use `@pytest.mark.parametrize` for boundary condition cases with multiple inputs
98
+
99
+ #### Test Integrity
100
+
101
+ - Tests verify implementation correctness — if a test fails, the implementation likely has a bug, not the test
102
+ - Do NOT weaken assertions, remove test cases, or modify test logic to make tests pass
103
+ - Do NOT add workarounds, skips, or try/except blocks to hide failures without explicit justification
104
+ - Report all failures honestly in the output; the downstream `execute-backend-pytest-shell` node captures exit codes and stdout/stderr as-is
105
+
106
+ #### Test Data Preparation Rules (MUST follow)
107
+
108
+ **When Setup is Needed**
109
+
110
+ Setup phase is REQUIRED only when test cases need pre-existing data:
111
+ - Query/Read APIs: need data to exist before querying
112
+ - Update/Delete APIs: need data to exist before modifying
113
+ - State transition tests: need data in specific state
114
+
115
+ Setup phase is NOT needed for:
116
+ - Create APIs: testing the creation itself
117
+ - Validation tests: testing input validation with invalid data
118
+
119
+ **Data Setup Strategy**
120
+
121
+ When setup is needed:
122
+ 1. Use `@pytest.fixture(scope='module')` or `@pytest.fixture(scope='session')` to prepare shared test data
123
+ 2. All test cases in the file share the same pre-constructed data
124
+
125
+ **Data Construction Priority**
126
+
127
+ 1. **API-first**: Use documented APIs from `analyze-inputs-pi` / reviewed cases
128
+ 2. **Reuse existing conftest fixtures** (read-only)
129
+ 3. **Direct DB writes are last resort** and only via safe test-DB fixtures with rollback/isolation
130
+ 4. If neither API nor safe DB fixture exists, **skip with an explicit gap note** — do not invent credentials or touch live data
131
+
132
+ **API Data Construction**
133
+
134
+ - Prefer the `analyze-inputs-pi` API Endpoints section and reviewed cases for method/path/fields
135
+ - Chain API calls only when cases document multi-step preconditions
136
+ - Store created resource IDs in fixtures for reuse
137
+ - Do **not** broadly search host route/controller trees for secrets, `.env`, private keys, or production configs
138
+ - Read host API definitions only when needed to resolve a field name already referenced by reviewed cases
139
+
140
+ **Database Data Construction (restricted)**
141
+
142
+ - Allowed only via existing `conftest.py` test-DB fixtures with transaction rollback or equivalent isolation
143
+ - Never hardcode connection strings, passwords, tokens, or cloud credentials
144
+ - Never target production/shared non-test databases
145
+ - If isolation is unclear, report the gap instead of writing DB rows
146
+
147
+ #### Assertion Rules (MUST follow)
148
+
149
+ **Positive Path (成功场景)**
150
+
151
+ MUST assert ALL of the following:
152
+ 1. HTTP status code: as defined in API spec (e.g. 200, 201)
153
+ 2. Response structure: key fields exist in response body
154
+ 3. Specific values: each field equals expected value from test case
155
+ 4. Data type: each field is correct type
156
+
157
+ **Negative Path (异常场景)**
158
+
159
+ MUST assert ALL of the following:
160
+ 1. HTTP status code: as defined in API spec (e.g. 400, 404, 500)
161
+ 2. Error code field: field name from API spec (e.g. code, error_code, errcode, ret)
162
+ 3. Error message field: field name from API spec (e.g. message, msg, errmsg, error)
163
+
164
+ **Field Name Resolution**
165
+
166
+ Field names MUST come from the upstream `analyze-inputs-pi` output (API Endpoints section), NOT hardcoded. For example:
167
+ - If API spec defines `{"ret": 0, "msg": "success"}`, assert `response.json()["ret"]` and `response.json()["msg"]`
168
+ - If API spec defines `{"code": 4001, "message": "error"}`, assert `response.json()["code"]` and `response.json()["message"]`
169
+
170
+
171
+ #### Conditional Test Implementation (include ONLY if test cases exist)
172
+
173
+ - **Authentication tests**: implement ONLY if `testcase/md/` contains auth-related cases
174
+ - Use `@pytest.mark.auth` marker
175
+ - Test no token, expired token, invalid token, insufficient permissions, cross-user access
176
+ - **Timeout tests**: implement ONLY if `testcase/md/` contains timeout-related cases
177
+ - Use `@pytest.mark.timeout` marker
178
+ - Use `unittest.mock.patch` or `pytest-mock` to simulate slow responses
179
+ - If no such cases exist in the reviewed test cases, do NOT add these tests
180
+
181
+ #### Markers
182
+
183
+ - `@pytest.mark.positive` — happy path cases
184
+ - `@pytest.mark.negative` — error/exception cases
185
+ - `@pytest.mark.boundary` — edge cases
186
+ - `@pytest.mark.<MODULE>` — module-specific marker (e.g. `@pytest.mark.order`)
187
+
188
+ #### Skip Policy
189
+
190
+ If a test case cannot be automated (requires external service not mockable, requires manual verification), add it with `@pytest.mark.skip(reason="...")` and document the reason. Do not omit the function — traceability requires it exists.
191
+
192
+ ### Output Shape (after summary line)
193
+
194
+ After the mandatory summary line, provide:
195
+
196
+ 1. **Generated Files** — list of files written under `tests/backend/`.
197
+ 2. **Function Mapping Table** — `| Test Case ID | Pytest Function | File | Marker |`.
198
+ 3. **Skipped Cases** — if any, list with reason.
199
+ 4. **Conventions Observed** — note project fixtures/config discovered and followed.
200
+ 5. **Residual Risks** — cases that may need manual verification or environment setup.
201
+
202
+ Do not include chain-of-thought. Do not write root `artifacts/**`.