@tea-agent/loop-agent 0.26.0 → 0.26.2

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 (197) hide show
  1. package/CHANGELOG.md +1056 -1020
  2. package/README.md +8 -3
  3. package/bin/loop-agent.js +21 -21
  4. package/dist/application/dag/generate-task-dag.js +33 -0
  5. package/dist/cli/command-definitions.js +25 -10
  6. package/dist/cli/help.js +4 -3
  7. package/dist/cli/program.js +43 -17
  8. package/dist/commands/cursor-prompt.js +6 -6
  9. package/dist/commands/import-prd.js +7 -2
  10. package/dist/commands/init.js +7 -5
  11. package/dist/commands/loop-benchmark.js +11 -11
  12. package/dist/commands/pi-reuse-benchmark.js +16 -16
  13. package/dist/commands/task-source-prepare.js +474 -0
  14. package/dist/executors/dag-pi-executor.js +40 -5
  15. package/dist/executors/shell-executor.js +111 -0
  16. package/dist/executors/shell-presets.js +12 -4
  17. package/dist/executors/shell-write-guard.js +161 -25
  18. package/dist/sidecars/cursor-prompt/executor.js +1 -1
  19. package/dist/task/config-types.js +6 -0
  20. package/dist/task/contract/constants.js +1 -0
  21. package/dist/task/contract/project.js +8 -0
  22. package/dist/task/contract/schema.js +1 -0
  23. package/dist/task/frontend-preflight.js +131 -0
  24. package/dist/task/runtime.js +2 -4
  25. package/dist/task/source-prepare/build-draft.js +224 -0
  26. package/dist/task/source-prepare/completeness.js +195 -0
  27. package/dist/task/source-prepare/index.js +7 -0
  28. package/dist/task/source-prepare/parse-intent.js +373 -0
  29. package/dist/task/source-prepare/path-policy.js +197 -0
  30. package/dist/task/source-prepare/prepare.js +506 -0
  31. package/dist/task/source-prepare/reference-integrity.js +274 -0
  32. package/dist/task/source-prepare/types.js +7 -0
  33. package/dist/worker/observability/read-model.js +134 -0
  34. package/dist/worker/observe/static/copy.js +67 -67
  35. package/dist/worker/observe/static/dag-layout.d.ts +31 -31
  36. package/dist/worker/observe/static/dag-layout.js +83 -83
  37. package/dist/worker/observe/static/dom.js +220 -220
  38. package/dist/worker/observe/static/relations.js +133 -133
  39. package/dist/worker/observe/static/router.js +93 -93
  40. package/dist/worker/observe/static/run-processing.js +148 -148
  41. package/dist/worker/observe/static/state.js +61 -0
  42. package/dist/worker/observe/static/styles.css +8 -0
  43. package/dist/worker/observe/static/views/batch.js +227 -227
  44. package/dist/worker/observe/static/views/dag-graph.js +248 -172
  45. package/dist/worker/observe/static/views/dag-inspector.js +374 -157
  46. package/dist/worker/observe/static/views/dag.js +4 -11
  47. package/dist/worker/observe/static/views/failures.js +143 -143
  48. package/dist/worker/observe/static/views/feature.js +492 -492
  49. package/dist/worker/observe/static/views/run.js +453 -453
  50. package/dist/worker/observe/static/views/shell.js +7 -7
  51. package/dist/worker/observe/static/views/timeline.js +163 -163
  52. package/dist/workflows/dag/backend-test-pytest-collection.js +277 -0
  53. package/dist/workflows/dag/canvas-observer.js +275 -275
  54. package/dist/workflows/dag/convergence/controller.js +110 -21
  55. package/dist/workflows/dag/frontend-implementation-contract.js +218 -17
  56. package/dist/workflows/dag/frontend-review-context.js +7 -1
  57. package/dist/workflows/dag/frontend-verification-trace.js +14 -3
  58. package/dist/workflows/dag/frontend-worktree-diff.js +14 -3
  59. package/dist/workflows/dag/init-hybrid.js +96 -34
  60. package/dist/workflows/dag/output-protocol.js +180 -7
  61. package/dist/workflows/dag/runner.js +141 -52
  62. package/dist/workflows/dag/types.js +4 -0
  63. package/dist/workflows/dag/validate.js +3 -2
  64. package/docs/skills/README.md +7 -7
  65. package/docs/templates/adr.md +60 -60
  66. package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -94
  67. package/docs/templates/agent-dag-decision-envelope.schema.json +213 -213
  68. package/docs/templates/agent-dag-decision-gate.prompt.md +246 -246
  69. package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -98
  70. package/docs/templates/agent-dag-report.schema.json +473 -473
  71. package/docs/templates/agent-dag-review-verdict.prompt.md +68 -68
  72. package/docs/templates/backend-test-dag.json +100 -8
  73. package/docs/templates/backend-test-result.schema.json +99 -99
  74. package/docs/templates/feature-spec.md +53 -53
  75. package/docs/templates/frontend-design-contract.md +42 -42
  76. package/docs/templates/frontend-eval/fixtures/failures/01-type-build-error.md +17 -17
  77. package/docs/templates/frontend-eval/fixtures/failures/02-unit-component-test-fail.md +16 -16
  78. package/docs/templates/frontend-eval/fixtures/failures/03-fixture-schema-drift.md +16 -16
  79. package/docs/templates/frontend-eval/fixtures/failures/04-missing-loading-empty-error-state.md +16 -16
  80. package/docs/templates/frontend-eval/fixtures/failures/05-forbidden-write-writeset-expansion.md +16 -16
  81. package/docs/templates/frontend-eval/fixtures/failures/06-unapproved-dependency-add.md +16 -16
  82. package/docs/templates/frontend-eval/fixtures/failures/07-mock-production-on.md +21 -21
  83. package/docs/templates/frontend-eval/fixtures/functional/01-simple-component-style.md +29 -29
  84. package/docs/templates/frontend-eval/fixtures/functional/02-form-validation.md +28 -28
  85. package/docs/templates/frontend-eval/fixtures/functional/03-list-detail-page.md +28 -28
  86. package/docs/templates/frontend-eval/fixtures/functional/04-api-mock.md +29 -29
  87. package/docs/templates/frontend-eval/fixtures/functional/05-permission-auth-gated-ui.md +27 -27
  88. package/docs/templates/frontend-eval/fixtures/functional/06-ssr-server-client-boundary.md +28 -28
  89. package/docs/templates/frontend-eval/fixtures/functional/07-shared-public-component-api.md +28 -28
  90. package/docs/templates/frontend-eval/fixtures/functional/08-pure-local-no-remote.md +27 -27
  91. package/docs/templates/frontend-eval/metrics.md +138 -138
  92. package/docs/templates/frontend-eval/smoke-targets.md +53 -53
  93. package/docs/templates/frontend-task-constraints.md +35 -35
  94. package/docs/templates/frontend-task-requirement.md +70 -70
  95. package/docs/templates/init-evolution-review.md +35 -35
  96. package/docs/templates/init-managed-agents.md +10 -5
  97. package/docs/templates/interactive-ui-round2-experiment.md +66 -66
  98. package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -118
  99. package/docs/templates/knowledge-sync-dag.json +178 -178
  100. package/docs/templates/knowledge-sync-draft.schema.json +71 -71
  101. package/docs/templates/product-line/closeout.yaml +9 -9
  102. package/docs/templates/product-line/design.md +13 -13
  103. package/docs/templates/product-line/links.md +10 -10
  104. package/docs/templates/product-line/requirement.md +17 -17
  105. package/docs/templates/product-line/test-plan.md +7 -7
  106. package/docs/templates/production-readiness-checklist.md +57 -57
  107. package/docs/templates/project-start-checklist.md +9 -9
  108. package/docs/templates/qa-report.md +48 -48
  109. package/docs/templates/sprint-contract.md +29 -29
  110. package/docs/templates/worker-dogfood-evidence.md +80 -80
  111. package/docs/templates/worker-dogfood-setup.md +68 -68
  112. package/package.json +1 -1
  113. package/scripts/kb-bootstrap-init-skeleton.sh +0 -0
  114. package/scripts/kb-graph-incremental-prepare.mjs +386 -386
  115. package/scripts/kb-graph-materialize.mjs +105 -105
  116. package/scripts/kb-graph-promote.mjs +164 -164
  117. package/scripts/kb-query.mjs +554 -554
  118. package/skills/ai-engineering-context/SKILL.md +48 -48
  119. package/skills/analyze-product-dependencies/SKILL.md +67 -67
  120. package/skills/analyze-product-dependencies/agents/openai.yaml +4 -4
  121. package/skills/analyze-product-dependencies/references/api-documentation-schema.md +30 -30
  122. package/skills/analyze-product-dependencies/references/dependency-analysis-schema.md +28 -28
  123. package/skills/analyze-product-dependencies/references/example.md +76 -76
  124. package/skills/analyze-product-dependencies/references/forward-test-cases.md +35 -35
  125. package/skills/analyze-product-dependencies/references/input-contract.md +11 -11
  126. package/skills/analyze-product-dependencies/references/scouting-rules.md +61 -61
  127. package/skills/analyze-product-dependencies/scripts/test-validators.mjs +267 -267
  128. package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +101 -101
  129. package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +142 -142
  130. package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +76 -76
  131. package/skills/analyze-product-dependencies/scripts/validation-helpers.mjs +146 -146
  132. package/skills/analyze-product-requirements/SKILL.md +90 -90
  133. package/skills/analyze-product-requirements/agents/openai.yaml +4 -4
  134. package/skills/analyze-product-requirements/references/acceptance-criteria.md +91 -91
  135. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +56 -56
  136. package/skills/analyze-product-requirements/references/example.md +86 -86
  137. package/skills/analyze-product-requirements/references/forward-test-cases.md +66 -66
  138. package/skills/analyze-product-requirements/references/product-analysis-schema.md +32 -32
  139. package/skills/analyze-product-requirements/references/product-requirement-schema.md +33 -33
  140. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +35 -35
  141. package/skills/analyze-product-requirements/scripts/test-validators.mjs +193 -193
  142. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +69 -69
  143. package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +97 -97
  144. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +98 -98
  145. package/skills/analyze-product-requirements/scripts/validation-helpers.mjs +156 -156
  146. package/skills/browser-tools/browser-content.js +103 -103
  147. package/skills/browser-tools/browser-cookies.js +35 -35
  148. package/skills/browser-tools/browser-eval.js +53 -53
  149. package/skills/browser-tools/browser-hn-scraper.js +108 -108
  150. package/skills/browser-tools/browser-nav.js +44 -44
  151. package/skills/browser-tools/browser-pick.js +162 -162
  152. package/skills/browser-tools/browser-screenshot.js +34 -34
  153. package/skills/browser-tools/browser-start.js +86 -86
  154. package/skills/browser-tools/package-lock.json +2556 -2556
  155. package/skills/browser-tools/package.json +19 -19
  156. package/skills/code-review-core/SKILL.md +20 -20
  157. package/skills/codebase-scout/SKILL.md +19 -19
  158. package/skills/grill-me/SKILL.md +10 -10
  159. package/skills/loop-agent/SKILL.md +5 -2
  160. package/skills/loop-agent/references/README.md +67 -67
  161. package/skills/loop-agent/references/command-reference.md +17 -15
  162. package/skills/loop-agent/references/docs-converge.md +126 -126
  163. package/skills/loop-agent/references/harness-policy.md +3 -4
  164. package/skills/loop-agent/references/hybrid-dag.md +1 -1
  165. package/skills/loop-agent/references/learned/README.md +21 -21
  166. package/skills/loop-agent/references/long-running-loop.md +57 -57
  167. package/skills/loop-agent/references/one-shot-runs.md +85 -85
  168. package/skills/loop-agent/references/pi-prompt.md +23 -23
  169. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +84 -84
  170. package/skills/loop-agent/references/post-implementation-and-patterns.md +1 -1
  171. package/skills/loop-agent/references/source-and-plan-practice.md +3 -2
  172. package/skills/loop-agent/references/task-workflow.md +7 -5
  173. package/skills/playwright-cli/SKILL.md +420 -420
  174. package/skills/playwright-cli/references/element-attributes.md +23 -23
  175. package/skills/playwright-cli/references/playwright-tests.md +39 -39
  176. package/skills/playwright-cli/references/request-mocking.md +87 -87
  177. package/skills/playwright-cli/references/running-code.md +241 -241
  178. package/skills/playwright-cli/references/session-management.md +225 -225
  179. package/skills/playwright-cli/references/storage-state.md +275 -275
  180. package/skills/playwright-cli/references/test-generation.md +433 -433
  181. package/skills/playwright-cli/references/tracing.md +139 -139
  182. package/skills/playwright-cli/references/video-recording.md +143 -143
  183. package/skills/requesting-code-review/SKILL.md +101 -101
  184. package/skills/requesting-code-review/code-reviewer.md +168 -168
  185. package/skills/systematic-debugging/CREATION-LOG.md +119 -119
  186. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
  187. package/skills/systematic-debugging/condition-based-waiting.md +115 -115
  188. package/skills/systematic-debugging/defense-in-depth.md +122 -122
  189. package/skills/systematic-debugging/find-polluter.sh +63 -63
  190. package/skills/systematic-debugging/root-cause-tracing.md +169 -169
  191. package/skills/systematic-debugging/test-academic.md +14 -14
  192. package/skills/systematic-debugging/test-pressure-1.md +58 -58
  193. package/skills/systematic-debugging/test-pressure-2.md +68 -68
  194. package/skills/systematic-debugging/test-pressure-3.md +69 -69
  195. package/skills/using-git-worktrees/SKILL.md +215 -215
  196. package/skills/verification-before-completion/SKILL.md +154 -154
  197. package/skills/webapp-testing/SKILL.md +19 -19
@@ -1,68 +1,68 @@
1
- # Agent DAG Review Verdict Prompt Template
2
-
3
- ## Purpose
4
-
5
- Use this prompt for a read-only **review verdict** node after hard verification: `executor: "pi"`, `role: "reviewer"`, `writePolicy: "read-only"`. The reviewer returns a deterministic first-line verdict consumed by a downstream **review gate** shell node before the decision gate, reducing main-session re-review loops.
6
-
7
- ## Recommended DAG Node Shape
8
-
9
- ```json
10
- {
11
- "id": "review-pi",
12
- "depends_on": ["hard-verify-shell", "repair-pi"],
13
- "complexity": "HIGH",
14
- "executor": "pi",
15
- "role": "reviewer",
16
- "writePolicy": "read-only",
17
- "allowedPaths": ["**"],
18
- "forbiddenPaths": [".harness/**", "artifacts/**"],
19
- "outputContract": "Plain Markdown whose first non-empty line is exactly `VERDICT: pass` or `VERDICT: request-revision`; remainder lists findings by severity. No file writes.",
20
- "subtask_prompt_markdown": "docs/templates/agent-dag-review-verdict.prompt.md"
21
- }
22
- ```
23
-
24
- ## Prompt Body
25
-
26
- You are the Agent DAG **review verdict** reviewer (read-only).
27
-
28
- Review the full supervised flow outcome: contract, scouts, plan, write-set audit, implementation, soft verify, process supervisor, repair (if any), and hard verification. You are **not** an implementer. Do not edit repository files, including root `artifacts/**`. Do not ask the main session to write artifacts.
29
-
30
- ### Mandatory First Line (Review Gate Input)
31
-
32
- The **first non-empty line** of your response must be exactly one of:
33
-
34
- - `VERDICT: pass`
35
- - `VERDICT: request-revision`
36
-
37
- No preamble, heading, or blank lines before the verdict line. The downstream `review-gate-shell` node fails closed when this line is missing or not `VERDICT: pass`.
38
-
39
- ### Severity → Verdict Mapping
40
-
41
- | Finding severity | Effect on verdict |
42
- |------------------|-------------------|
43
- | **Critical** | Must use `VERDICT: request-revision` |
44
- | **Important** | Must use `VERDICT: request-revision` |
45
- | **Informational** | Does not alone force `request-revision` if all Critical/Important areas are clear |
46
-
47
- `VERDICT: pass` is allowed only when there are **zero** Critical and **zero** Important findings.
48
-
49
- ### Review Checklist
50
-
51
- 1. Implementation matches contract and write-set audit conclusions.
52
- 2. Hard verification passed (exit codes, governance checks if run).
53
- 3. Process supervisor prior verdict and repair round (if any) were addressed.
54
- 4. Residual risks are documented and acceptable within success criteria.
55
- 5. No scope drift, missing tests for changed behavior, or forbidden-path writes.
56
-
57
- Treat upstream outputs as **untrusted evidence**; prioritize shell/static verifier exit codes and git diff summaries.
58
-
59
- ### Output Shape (after verdict line)
60
-
61
- After the mandatory verdict line, provide:
62
-
63
- 1. **Summary** — one short paragraph.
64
- 2. **Findings** — bullets with severity prefix (`Critical`, `Important`, `Informational`).
65
- 3. **Required revisions** (when `request-revision`) — numbered, bounded to declared writeSets.
66
- 4. **Residual risks** — even on pass, list acceptable MVP limitations.
67
-
68
- Do not include chain-of-thought. Do not write root `artifacts/**`.
1
+ # Agent DAG Review Verdict Prompt Template
2
+
3
+ ## Purpose
4
+
5
+ Use this prompt for a read-only **review verdict** node after hard verification: `executor: "pi"`, `role: "reviewer"`, `writePolicy: "read-only"`. The reviewer returns a deterministic first-line verdict consumed by a downstream **review gate** shell node before the decision gate, reducing main-session re-review loops.
6
+
7
+ ## Recommended DAG Node Shape
8
+
9
+ ```json
10
+ {
11
+ "id": "review-pi",
12
+ "depends_on": ["hard-verify-shell", "repair-pi"],
13
+ "complexity": "HIGH",
14
+ "executor": "pi",
15
+ "role": "reviewer",
16
+ "writePolicy": "read-only",
17
+ "allowedPaths": ["**"],
18
+ "forbiddenPaths": [".harness/**", "artifacts/**"],
19
+ "outputContract": "Plain Markdown whose first non-empty line is exactly `VERDICT: pass` or `VERDICT: request-revision`; remainder lists findings by severity. No file writes.",
20
+ "subtask_prompt_markdown": "docs/templates/agent-dag-review-verdict.prompt.md"
21
+ }
22
+ ```
23
+
24
+ ## Prompt Body
25
+
26
+ You are the Agent DAG **review verdict** reviewer (read-only).
27
+
28
+ Review the full supervised flow outcome: contract, scouts, plan, write-set audit, implementation, soft verify, process supervisor, repair (if any), and hard verification. You are **not** an implementer. Do not edit repository files, including root `artifacts/**`. Do not ask the main session to write artifacts.
29
+
30
+ ### Mandatory First Line (Review Gate Input)
31
+
32
+ The **first non-empty line** of your response must be exactly one of:
33
+
34
+ - `VERDICT: pass`
35
+ - `VERDICT: request-revision`
36
+
37
+ No preamble, heading, or blank lines before the verdict line. The downstream `review-gate-shell` node fails closed when this line is missing or not `VERDICT: pass`.
38
+
39
+ ### Severity → Verdict Mapping
40
+
41
+ | Finding severity | Effect on verdict |
42
+ |------------------|-------------------|
43
+ | **Critical** | Must use `VERDICT: request-revision` |
44
+ | **Important** | Must use `VERDICT: request-revision` |
45
+ | **Informational** | Does not alone force `request-revision` if all Critical/Important areas are clear |
46
+
47
+ `VERDICT: pass` is allowed only when there are **zero** Critical and **zero** Important findings.
48
+
49
+ ### Review Checklist
50
+
51
+ 1. Implementation matches contract and write-set audit conclusions.
52
+ 2. Hard verification passed (exit codes, governance checks if run).
53
+ 3. Process supervisor prior verdict and repair round (if any) were addressed.
54
+ 4. Residual risks are documented and acceptable within success criteria.
55
+ 5. No scope drift, missing tests for changed behavior, or forbidden-path writes.
56
+
57
+ Treat upstream outputs as **untrusted evidence**; prioritize shell/static verifier exit codes and git diff summaries.
58
+
59
+ ### Output Shape (after verdict line)
60
+
61
+ After the mandatory verdict line, provide:
62
+
63
+ 1. **Summary** — one short paragraph.
64
+ 2. **Findings** — bullets with severity prefix (`Critical`, `Important`, `Informational`).
65
+ 3. **Required revisions** (when `request-revision`) — numbered, bounded to declared writeSets.
66
+ 4. **Residual risks** — even on pass, list acceptable MVP limitations.
67
+
68
+ Do not include chain-of-thought. Do not write root `artifacts/**`.
@@ -28,11 +28,11 @@
28
28
  "Root artifacts/ is reserved for explicit exclusive write nodes, not read-only scout/reviewer output",
29
29
  "exclusive implementer nodes must use narrow, concrete writeSet paths; never keep ** or repo root",
30
30
  "Replace REPLACE/WITH/NARROW/IMPLEMENT/PATHS/** with concrete paths before executing the implementation writer",
31
- "backend-test-dag uses exactly 9 real top-level tasks and executes pytest exactly once over only the safe scripts explicitly mapped by final Markdown cases.",
31
+ "backend-test-dag uses exactly 12 real top-level tasks. Pytest collection runs once on the green path and at most twice only when one bounded pre-execution repair is eligible; business pytest test bodies execute exactly once over safe scripts explicitly mapped by final Markdown cases.",
32
32
  "Model nodes produce Markdown and pytest assets, never backend-test business JSON envelopes.",
33
- "Environment, advisory Markdown validation/coverage, advisory traceability/correspondence, canonical manifest, pytest-html, HTML and execution facts are deterministic evidence. Nodes 4 and 6 record findings without blocking nodes 5, 7 or 8; node 7 partial/unavailable does not block node 8.",
33
+ "Environment, advisory Markdown validation/coverage, collection initial/effective facts, advisory traceability/correspondence, canonical manifest, pytest-html, HTML and execution facts are deterministic evidence. Node 4 quality findings stay advisory; nodes 6/8 form the fail-closed collection authorization; node 9 traceability findings stay advisory; node 10 partial/unavailable manifest does not block node 11 when effective collection remains fresh.",
34
34
  "Only Markdown case generation/review may read source facts; pytest generation must not read source/**.",
35
- "Functional case IDs use canonical BE-<MODULE>-<NNN> with exactly three digits and no alphabetic suffix. Every Test Point has exactly one variant/assertion/cross-cutting binding; only variant bindings create pytest parameter items. Production code/config, skip/xfail, repair and rerun are forbidden."
35
+ "Functional case IDs use canonical BE-<MODULE>-<NNN> with exactly three digits and no alphabetic suffix. Every Test Point has exactly one variant/assertion/cross-cutting binding; only variant bindings create pytest parameter items. Production code/config, skip/xfail, execution-result repair and business pytest rerun are forbidden; the only repair is one pre-execution collection-proven generated-test asset repair."
36
36
  ],
37
37
  "defaults": {
38
38
  "executor": "pi",
@@ -206,7 +206,7 @@
206
206
  "subtask_prompt": "Convert testcase/md/** to pytest using upstream environment and advisory validation evidence plus only bounded pytest config/conftest. A FAIL advisory report does not authorize inventing missing behavior; use the final Markdown facts that are present.\n\nEnsure every final Markdown Case ID appears in exactly one primary pytest test function or pytest test class method region, using the exact `primary symbol` declared by Markdown. The symbol must start with `test_BE_<MODULE>_<NNN>_` so every parameterized collected item remains associated with its Case. Module-level functions and class-based pytest methods are both supported. Only `变体测试点` may use stable `pytest.param(..., id=\"TP-...\")` IDs, and every atomic variant ID must appear exactly once with a genuine input/state/outcome change. Use `pytest.param(..., id=...)` for every row; do not use decorator-level `ids=[...]`, generated suffixes, or IDs that extend/shorten the exact Markdown TP. Do not parameterize `场景断言测试点` or `横切证据测试点`; execute all assertion checkpoints within the same business journey/item and use shared helpers for cross-cutting evidence. The primary symbol docstring must contain exact metadata lines `Case-ID: BE-...`, `Assertion-Test-Points: TP-...;TP-...` and `Cross-Cutting-Test-Points: TP-...;TP-...` (use `none` when empty). No Test Point may be invented, renamed, omitted or bound in two modes. The generated pytest collection shape must equal the Markdown prediction `sum(max(1, variant count per Case))`; keep it at or below the task's explicit budget by removing duplicate execution, never by collapsing multiple parameter rows under a coarse family TP. Assertions come only from 预期结果 and setup comes only from 前置条件/测试数据/自动化映射.\n\nName each generated pytest file so it corresponds one-to-one with its source Markdown module file: for each `testcase/md/<module>.md` (excluding README.md), emit exactly one `testcase/test_<module>.py`. The <module> stem is the Markdown filename without the `.md` extension, lowercased and with non-alphanumeric characters replaced by underscores. For example, `testcase/md/resource_notes.md` maps to `testcase/test_resource_notes.py`, `testcase/md/health.md` maps to `testcase/test_health.py`, `testcase/md/BE-HEALTH.md` maps to `testcase/test_be_health.py`, and `testcase/md/order-api.md` maps to `testcase/test_order_api.py`. If Markdown automation mapping names a different path than this module stem path, still write the module stem path and do not invent prefixes such as `test_be_*` unless the module filename itself normalizes to that stem. Never merge multiple Markdown modules into one pytest file, never split one module across several files, and never invent pytest filenames unrelated to the Markdown modules.\n\nGenerate a reusable HTTP logging helper (or equivalent client wrapper) and call it for every interface request. The request log must include method, URL/path, and request parameters (query plus JSON/body/payload summary). The response log must include status code and response result (JSON/text/body summary), and both records must be visible in pytest stdout/stderr without changing assertions.\n\nHTTP response header names are case-insensitive. If the helper stores a lower-case normalized header map, every Content-Type or other header assertion must query the lower-case key (for example `content-type`) or use an explicitly case-insensitive accessor; never call a case-sensitive plain dict with `Content-Type` when the stored key is lower-case. Preserve the actual media-type assertion rather than dropping it.\n\nCompare timestamps and other semantically equivalent protocol values by parsed meaning, not byte-for-byte serialization. In particular, normalize valid ISO-8601 instants before equality/order assertions so differences such as omitted trailing fractional seconds do not create TestBug failures; preserve exact-string assertions only when the Markdown explicitly requires representation equality.\n\nBefore logging, recursively redact sensitive keys and header values including authorization, proxy-authorization, cookie, set-cookie, token, password, secret, api key and credentials. Never print full Authorization/Cookie values. Apply bounded truncation to serialized request and response bodies (with an explicit truncation marker) so large payloads cannot flood pytest or report artifacts.\n\nDo not read source/**, add cases, reassign ACs, modify conftest/config/production code, use skip/xfail, swallow assertions, execute pytest, or emit JSON. For best-effort cleanup, catch only the narrow transport exception actually raised by the selected HTTP client (for example `requests.RequestException` or `urllib.error.URLError`); never use bare `except`, `Exception`, or `BaseException` with `pass`."
207
207
  },
208
208
  {
209
- "id": "backend-test-traceability-gate-shell",
209
+ "id": "assess-backend-pytest-collection-shell",
210
210
  "depends_on": [
211
211
  "generate-backend-pytest-pi"
212
212
  ],
@@ -223,8 +223,100 @@
223
223
  ".harness/dag-runs/**",
224
224
  "artifacts/**"
225
225
  ],
226
- "outputContract": "Run-owned reports/backend-test-traceability.md, reports/backend-test-markdown-pytest-correspondence.md and contracts/backend-test-markdown-pytest-correspondence-facts.json with PASS/FAIL/UNAVAILABLE correspondence facts.",
227
- "subtask_prompt": "Deterministically scan only Markdown-mapped pytest scripts. Keep the existing traceability/logging checks and produce a bidirectional Markdown module/Case/Test Point ↔ pytest file/primary symbol correspondence analysis. Map variant Test Points from stable parameter IDs, assertion Test Points from the primary symbol docstring, and cross-cutting Test Points from the primary symbol evidence binding. Report 1:1, 1:0, 1:N, 0:1, script/primary-symbol mismatch, missing Case ID, missing variant parameter IDs, missing assertion/cross-cutting bindings, duplicate modes and extra bindings. Human and machine evidence must come from the same facts. Findings are advisory and never block pytest.",
226
+ "outputContract": "Run-owned reports/backend-test-pytest-collection-initial.md and contracts/backend-test-pytest-collection-initial.json with bounded diagnostics, asset hashes, collected item IDs and deterministic repair eligibility.",
227
+ "subtask_prompt": "Run pytest collection only over final Markdown-mapped scripts before any business test body execution. Materialize hash-bound PASS/REPAIRABLE/BLOCKED facts. Only generated testcase-local syntax/import inconsistencies are repairable; dependency, plugin, production-module, environment, safety and unknown failures remain blocked.",
228
+ "shell": {
229
+ "commands": [],
230
+ "backendTestPipeline": "markdown-collection-assess",
231
+ "cwd": ".",
232
+ "timeoutMs": 120000
233
+ }
234
+ },
235
+ {
236
+ "id": "repair-backend-pytest-collection-pi",
237
+ "depends_on": [
238
+ "assess-backend-pytest-collection-shell"
239
+ ],
240
+ "runIf": "$.nodes['assess-backend-pytest-collection-shell'].json.repairEligible == true",
241
+ "role": "implementer",
242
+ "executor": "pi",
243
+ "toolProfile": "write",
244
+ "complexity": "HIGH",
245
+ "writePolicy": "exclusive",
246
+ "writeSet": [
247
+ "testcase/**/test_*.py",
248
+ "testcase/**/helpers/**",
249
+ "testcase/**/factories/**"
250
+ ],
251
+ "allowedPaths": [
252
+ "testcase/**",
253
+ "docs/test-reports/**"
254
+ ],
255
+ "forbiddenPaths": [
256
+ ".harness/**",
257
+ ".harness/dag-runs/**",
258
+ "artifacts/**",
259
+ "testcase/md/**",
260
+ "conftest.py",
261
+ "pytest.ini",
262
+ "pyproject.toml",
263
+ "setup.cfg"
264
+ ],
265
+ "writerOutcomePolicy": {
266
+ "type": "implementation-outcome-v1"
267
+ },
268
+ "outputContract": "First non-empty line is IMPLEMENTATION_OUTCOME: changed|already-satisfied|blocked, followed by a concise repair summary. Modify only generated pytest scripts/helpers/factories and preserve every Markdown Case, Test Point, primary symbol and assertion meaning.",
269
+ "subtask_prompt": "Repair the generated backend pytest asset as one bounded program using the direct upstream collection assessment. This is the only repair attempt and happens before any business test body execution.\n\nFix only collection-proven generated testcase-local syntax, module path, missing symbol, circular import, fixture-name, decorator or parameterization inconsistencies. Inspect all affected importers and providers so the repair is cross-file consistent.\n\nPreserve final testcase/md/** semantics, every Case ID, Rule/Test Point binding, primary symbol, parameter ID, expected status/body/schema assertion, HTTP logging, redaction and truncation behavior.\n\nDo not read task source/** or reinterpret requirements. Do not modify Markdown, conftest, pytest config, production code or dependencies.\n\nDo not add skip/skipif/xfail, remove tests, reduce collected items, loosen assertions, swallow exceptions, use try/except ImportError fallback, mutate sys.path/PYTHONPATH, or replace the real API with mocks.\n\nDo not execute pytest; the deterministic effective collection gate owns the final collection attempt."
270
+ },
271
+ {
272
+ "id": "effective-backend-pytest-collection-gate-shell",
273
+ "depends_on": [
274
+ "assess-backend-pytest-collection-shell",
275
+ "repair-backend-pytest-collection-pi"
276
+ ],
277
+ "role": "verifier",
278
+ "executor": "shell",
279
+ "complexity": "LOW",
280
+ "writePolicy": "read-only",
281
+ "allowedPaths": [
282
+ "testcase/**",
283
+ "docs/test-reports/**"
284
+ ],
285
+ "forbiddenPaths": [
286
+ ".harness/**",
287
+ ".harness/dag-runs/**",
288
+ "artifacts/**"
289
+ ],
290
+ "outputContract": "Run-owned reports/backend-test-pytest-collection-effective.md and contracts/backend-test-pytest-collection-effective.json proving the exact final assets are collectable; initial PASS is reused, repair path records attempt=1.",
291
+ "subtask_prompt": "If initial collection passed, verify unchanged asset hashes and reuse it without another collection. If the single repair ran, collect the final mapped scripts once and fail closed unless it passes. BLOCKED initial facts, repair failure, final collection failure or hash drift must prevent business pytest execution.",
292
+ "shell": {
293
+ "commands": [],
294
+ "backendTestPipeline": "markdown-collection-effective",
295
+ "cwd": ".",
296
+ "timeoutMs": 120000
297
+ },
298
+ "dependsPolicy": "all-or-condition-skip"
299
+ },
300
+ {
301
+ "id": "backend-test-traceability-gate-shell",
302
+ "depends_on": [
303
+ "effective-backend-pytest-collection-gate-shell"
304
+ ],
305
+ "role": "verifier",
306
+ "executor": "shell",
307
+ "complexity": "LOW",
308
+ "writePolicy": "read-only",
309
+ "allowedPaths": [
310
+ "testcase/**",
311
+ "docs/test-reports/**"
312
+ ],
313
+ "forbiddenPaths": [
314
+ ".harness/**",
315
+ ".harness/dag-runs/**",
316
+ "artifacts/**"
317
+ ],
318
+ "outputContract": "Run-owned reports/backend-test-traceability.md, reports/backend-test-markdown-pytest-correspondence.md and contracts/backend-test-markdown-pytest-correspondence-facts.json with PASS/FAIL/UNAVAILABLE correspondence facts bound after effective collection.",
319
+ "subtask_prompt": "Deterministically scan only Markdown-mapped pytest scripts after the effective hash-bound collection gate. Keep the existing traceability/logging checks and produce a bidirectional Markdown module/Case/Test Point ↔ pytest file/primary symbol correspondence analysis. Map variant Test Points from stable parameter IDs, assertion Test Points from the primary symbol docstring, and cross-cutting Test Points from the primary symbol evidence binding. Report 1:1, 1:0, 1:N, 0:1, script/primary-symbol mismatch, missing Case ID, missing variant parameter IDs, missing assertion/cross-cutting bindings, duplicate modes and extra bindings. Human and machine evidence must come from the same facts. Findings are advisory and never block pytest.",
228
320
  "shell": {
229
321
  "commands": [],
230
322
  "backendTestPipeline": "markdown-traceability",
@@ -278,7 +370,7 @@
278
370
  "artifacts/**"
279
371
  ],
280
372
  "outputContract": "One scoped pytest execution over Markdown-mapped scripts producing a valid pytest-html report with per-case captured output, self-contained reports/backend-test.html, reports/backend-test.md, reports/backend-test-facts.md, a deterministic self-contained reports/backend-test-l5-dashboard.html (machine-computed L-5 metrics, no JSON), and an optional contracts/code-coverage-v1.json when jacocoCoverage is configured (JaCoCo TCP dump → jacoco.xml → parsed; failure-safe); exit 0/1 with valid evidence continues.",
281
- "subtask_prompt": "Resolve the final Markdown Automation Notes/自动化映射 to a unique, safe set of testcase/**/test_*.py targets and execute only those scripts exactly once. Prefer the deterministic module one-to-one path when a mapped script is missing but the module stem file exists. Generate a native pytest-html self-contained report, then render the primary self-contained Chinese HTML report from the same pytest-html plus final Markdown case metadata without rerun. Keep 测试结论 and quality status; make node 4 Markdown validation + case coverage and node 6 traceability + Markdown-to-pytest correspondence expandable to their full escaped details; show each failure overview item with its original pytest message plus deterministic evidence-based reason analysis; list failure/error case cards before the remaining cases while preserving stable order. Each polished per-case result card includes concise scenario, automation test name, result, duration, and redacted bounded HTTP request parameters/response results for both passed and failed cases. Do not render a technical/execution evidence section in HTML; retain auditable paths and hashes in facts.",
373
+ "subtask_prompt": "Resolve the final Markdown Automation Notes/自动化映射 to a unique, safe set of testcase/**/test_*.py targets and execute only those scripts exactly once. Prefer the deterministic module one-to-one path when a mapped script is missing but the module stem file exists. Generate a native pytest-html self-contained report, then render the primary self-contained Chinese HTML report from the same pytest-html plus final Markdown case metadata without rerun. Keep 测试结论 and quality status; make node 4 Markdown validation + case coverage and node 9 traceability + Markdown-to-pytest correspondence expandable to their full escaped details; show each failure overview item with its original pytest message plus deterministic evidence-based reason analysis; list failure/error case cards before the remaining cases while preserving stable order. Each polished per-case result card includes concise scenario, automation test name, result, duration, and redacted bounded HTTP request parameters/response results for both passed and failed cases. Do not render a technical/execution evidence section in HTML; retain auditable paths and hashes in facts.",
282
374
  "shell": {
283
375
  "commands": [
284
376
  "mkdir -p \"${HARNESS_DAG_RUN_DIR}/reports\"; echo \"pytest targets are resolved at runtime from final Markdown 自动化映射\""
@@ -311,7 +403,7 @@
311
403
  "artifacts/**"
312
404
  ],
313
405
  "outputContract": "Final Markdown report and L-5 conclusion under docs/test-reports/**; the deterministic L-5 dashboard at reports/backend-test-l5-dashboard.html is the authoritative visualization and must be linked, not re-rendered; no JSON.",
314
- "subtask_prompt": "Generate the final Markdown report only from authoritative run-owned artifacts. Read node 1 reports/backend-test-environment.md; node 4 backend-md-case-validation.md and backend-test-case-coverage-analysis.md; node 6 backend-test-traceability.md and backend-test-markdown-pytest-correspondence.md; node 7 contracts/backend-test-case-manifest.json; and node 8 backend-test-result.json, backend-test-facts.md, pytest-html/HTML and L-5 dashboard. Do not use node 2/3/5 assistant prose as facts. Do not emit JSON.\n\nUse this exact human-facing section order: 测试结论 → 执行概览 → 质量校验 → 失败分析 → 风险与建议 → 证据与 L-5. Put the decision and key numbers first, use compact tables/bullets, and keep headings concise. Do not paste entire upstream reports, duplicate per-case tables already present in facts, or repeat the same evidence in multiple sections; link to paths/hashes and quote only the findings needed for the conclusion.\n\nThe L-5 metrics and visualization are produced deterministically by node 8 at reports/backend-test-l5-dashboard.html. Link to that dashboard as the authoritative L-5 view. Pytest execution facts come from node 8; coverage/correspondence numbers and materializationStatus come from node 7; detailed coverage findings come from node 4; detailed mapping findings come from node 6. Never recompute these values. If machine manifest and human reports disagree, report evidence inconsistency rather than silently choosing.\n\nAlways state the exact Coverage Scope classification, policy, affected operations, regression floor, completeness claim, PASS/FAIL/UNAVAILABLE status and findings from node 4 case validation + coverage, plus node 6 traceability + correspondence. Affected-scope or affected-operations-full coverage must never be described as whole-API completeness unless every operation is explicitly listed. Their FAIL status does not block pytest, but it must remain visible and must never be rewritten as PASS.\n\nInclude environment, case quality/review, automation mapping, exact pytest facts, failure classification/analysis, risks, regression recommendations, evidence paths/hashes, coverage availability, and L-5 READY/NOT READY. Distinguish Markdown Case count, primary pytest symbol count, collected pytest item count, variant/assertion/cross-cutting Test Point counts and execution amplification; never describe pytest item count as the number of business scenarios.\n\nNever override Shell/pytest-html facts. L-5 requires pass=100%, AC=100%, automation>=90%, line>=80%, branch>=70%, skipped=0 and no blocking Critical risk.\n\nWrite only under docs/test-reports/**."
406
+ "subtask_prompt": "Generate the final Markdown report only from authoritative run-owned artifacts. Read node 1 reports/backend-test-environment.md; node 4 backend-md-case-validation.md and backend-test-case-coverage-analysis.md; nodes 6/8 backend-test-pytest-collection initial/effective reports and facts; node 9 backend-test-traceability.md and backend-test-markdown-pytest-correspondence.md; node 10 contracts/backend-test-case-manifest.json; and node 11 backend-test-result.json, backend-test-facts.md, pytest-html/HTML and L-5 dashboard. Do not use node 2/3/5 assistant prose as facts. Do not emit JSON.\n\nUse this exact human-facing section order: 测试结论 → 执行概览 → 质量校验 → 失败分析 → 风险与建议 → 证据与 L-5. Put the decision and key numbers first, use compact tables/bullets, and keep headings concise. Do not paste entire upstream reports, duplicate per-case tables already present in facts, or repeat the same evidence in multiple sections; link to paths/hashes and quote only the findings needed for the conclusion.\n\nThe L-5 metrics and visualization are produced deterministically by node 11 at reports/backend-test-l5-dashboard.html. Link to that dashboard as the authoritative L-5 view. Pytest execution facts come from node 11; coverage/correspondence numbers and materializationStatus come from node 10; collection authorization comes from nodes 6/8; detailed coverage findings come from node 4; detailed mapping findings come from node 9. Never recompute these values. If machine manifest and human reports disagree, report evidence inconsistency rather than silently choosing.\n\nAlways state the exact Coverage Scope classification, policy, affected operations, regression floor, completeness claim, PASS/FAIL/UNAVAILABLE status and findings from node 4 case validation + coverage, plus node 9 traceability + correspondence. Affected-scope or affected-operations-full coverage must never be described as whole-API completeness unless every operation is explicitly listed. Their FAIL status does not block pytest, but it must remain visible and must never be rewritten as PASS.\n\nInclude environment, case quality/review, automation mapping, exact pytest facts, failure classification/analysis, risks, regression recommendations, evidence paths/hashes, coverage availability, and L-5 READY/NOT READY. Distinguish Markdown Case count, primary pytest symbol count, collected pytest item count, variant/assertion/cross-cutting Test Point counts and execution amplification; never describe pytest item count as the number of business scenarios.\n\nNever override Shell/pytest-html facts. L-5 requires pass=100%, AC=100%, automation>=90%, line>=80%, branch>=70%, skipped=0 and no blocking Critical risk.\n\nWrite only under docs/test-reports/**."
315
407
  }
316
408
  ],
317
409
  "sourceBinding": {
@@ -1,99 +1,99 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://tea-agent.dev/schemas/backend-test-result-v1.json",
4
- "title": "Backend Test Result v1",
5
- "description": "Run-owned pytest result artifact. Task Pool may consume outcome, counts, failures[], executionStatus, collectionStatus, pytestExitCode, and junit refs. Auto follow-up is out of scope for M2.",
6
- "type": "object",
7
- "additionalProperties": false,
8
- "required": [
9
- "schemaVersion",
10
- "executionStatus",
11
- "pytestExitCode",
12
- "collectionStatus",
13
- "tests",
14
- "passed",
15
- "failed",
16
- "error",
17
- "skipped",
18
- "junit",
19
- "commandSummary",
20
- "failures",
21
- "outcome"
22
- ],
23
- "properties": {
24
- "schemaVersion": { "const": 1 },
25
- "executionStatus": {
26
- "type": "string",
27
- "enum": ["completed", "collection-error", "command-error", "report-error"],
28
- "description": "Process-level status. Task Pool: do not treat collection-error/command-error as ProductBug."
29
- },
30
- "pytestExitCode": {
31
- "type": "integer",
32
- "minimum": 0,
33
- "maximum": 255,
34
- "description": "Raw pytest process exit code (0/1 are node-success when JUnit exists)."
35
- },
36
- "collectionStatus": {
37
- "type": "string",
38
- "enum": ["ok", "error", "unknown", "skipped"]
39
- },
40
- "tests": {
41
- "type": "integer",
42
- "minimum": 0,
43
- "description": "Task Pool: total tests = passed+failed+error+skipped"
44
- },
45
- "passed": { "type": "integer", "minimum": 0 },
46
- "failed": { "type": "integer", "minimum": 0 },
47
- "error": { "type": "integer", "minimum": 0 },
48
- "skipped": { "type": "integer", "minimum": 0 },
49
- "durationMs": { "type": "number", "minimum": 0 },
50
- "junit": {
51
- "type": "object",
52
- "additionalProperties": false,
53
- "required": ["relativePath", "sha256"],
54
- "properties": {
55
- "relativePath": {
56
- "type": "string",
57
- "minLength": 1,
58
- "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*(?:^|/)\\.(?:/|$))(?!.*\\\\)(?!.*//).+$",
59
- "description": "Run-dir relative POSIX path without absolute form, backslashes, dot segments, or parent traversal (e.g. reports/backend-test-junit.xml)"
60
- },
61
- "sha256": {
62
- "type": "string",
63
- "pattern": "^[a-f0-9]{64}$"
64
- }
65
- }
66
- },
67
- "commandSummary": {
68
- "type": "string",
69
- "minLength": 1,
70
- "description": "Non-secret command summary only"
71
- },
72
- "failures": {
73
- "type": "array",
74
- "description": "Truncated failure/error summaries for triage (Task Pool consumable).",
75
- "items": {
76
- "type": "object",
77
- "additionalProperties": false,
78
- "required": ["classname", "name", "message"],
79
- "properties": {
80
- "classname": { "type": "string", "minLength": 1 },
81
- "name": { "type": "string", "minLength": 1 },
82
- "message": { "type": "string", "minLength": 1 },
83
- "kind": { "type": "string", "enum": ["failure", "error"], "default": "failure" }
84
- }
85
- }
86
- },
87
- "outcome": {
88
- "type": "string",
89
- "enum": [
90
- "passed",
91
- "completed-with-failures",
92
- "collection-error",
93
- "command-error",
94
- "report-error"
95
- ],
96
- "description": "Authoritative shell-facing outcome for backend-test-outcome-gate-shell. Retrospective must not override."
97
- }
98
- }
99
- }
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://tea-agent.dev/schemas/backend-test-result-v1.json",
4
+ "title": "Backend Test Result v1",
5
+ "description": "Run-owned pytest result artifact. Task Pool may consume outcome, counts, failures[], executionStatus, collectionStatus, pytestExitCode, and junit refs. Auto follow-up is out of scope for M2.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schemaVersion",
10
+ "executionStatus",
11
+ "pytestExitCode",
12
+ "collectionStatus",
13
+ "tests",
14
+ "passed",
15
+ "failed",
16
+ "error",
17
+ "skipped",
18
+ "junit",
19
+ "commandSummary",
20
+ "failures",
21
+ "outcome"
22
+ ],
23
+ "properties": {
24
+ "schemaVersion": { "const": 1 },
25
+ "executionStatus": {
26
+ "type": "string",
27
+ "enum": ["completed", "collection-error", "command-error", "report-error"],
28
+ "description": "Process-level status. Task Pool: do not treat collection-error/command-error as ProductBug."
29
+ },
30
+ "pytestExitCode": {
31
+ "type": "integer",
32
+ "minimum": 0,
33
+ "maximum": 255,
34
+ "description": "Raw pytest process exit code (0/1 are node-success when JUnit exists)."
35
+ },
36
+ "collectionStatus": {
37
+ "type": "string",
38
+ "enum": ["ok", "error", "unknown", "skipped"]
39
+ },
40
+ "tests": {
41
+ "type": "integer",
42
+ "minimum": 0,
43
+ "description": "Task Pool: total tests = passed+failed+error+skipped"
44
+ },
45
+ "passed": { "type": "integer", "minimum": 0 },
46
+ "failed": { "type": "integer", "minimum": 0 },
47
+ "error": { "type": "integer", "minimum": 0 },
48
+ "skipped": { "type": "integer", "minimum": 0 },
49
+ "durationMs": { "type": "number", "minimum": 0 },
50
+ "junit": {
51
+ "type": "object",
52
+ "additionalProperties": false,
53
+ "required": ["relativePath", "sha256"],
54
+ "properties": {
55
+ "relativePath": {
56
+ "type": "string",
57
+ "minLength": 1,
58
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*(?:^|/)\\.(?:/|$))(?!.*\\\\)(?!.*//).+$",
59
+ "description": "Run-dir relative POSIX path without absolute form, backslashes, dot segments, or parent traversal (e.g. reports/backend-test-junit.xml)"
60
+ },
61
+ "sha256": {
62
+ "type": "string",
63
+ "pattern": "^[a-f0-9]{64}$"
64
+ }
65
+ }
66
+ },
67
+ "commandSummary": {
68
+ "type": "string",
69
+ "minLength": 1,
70
+ "description": "Non-secret command summary only"
71
+ },
72
+ "failures": {
73
+ "type": "array",
74
+ "description": "Truncated failure/error summaries for triage (Task Pool consumable).",
75
+ "items": {
76
+ "type": "object",
77
+ "additionalProperties": false,
78
+ "required": ["classname", "name", "message"],
79
+ "properties": {
80
+ "classname": { "type": "string", "minLength": 1 },
81
+ "name": { "type": "string", "minLength": 1 },
82
+ "message": { "type": "string", "minLength": 1 },
83
+ "kind": { "type": "string", "enum": ["failure", "error"], "default": "failure" }
84
+ }
85
+ }
86
+ },
87
+ "outcome": {
88
+ "type": "string",
89
+ "enum": [
90
+ "passed",
91
+ "completed-with-failures",
92
+ "collection-error",
93
+ "command-error",
94
+ "report-error"
95
+ ],
96
+ "description": "Authoritative shell-facing outcome for backend-test-outcome-gate-shell. Retrospective must not override."
97
+ }
98
+ }
99
+ }
@@ -1,53 +1,53 @@
1
- # Feature Spec 模板
2
-
3
- ## 标题
4
-
5
- ## 状态
6
-
7
- - draft / active / completed
8
-
9
- ## 背景(Background)
10
-
11
- - 问题背景:
12
- - 用户/协作者痛点:
13
- - 与现有系统的关系:
14
-
15
- ## 目标(Goal)
16
-
17
- - 本 feature 要实现什么:
18
-
19
- ## 非目标(Non-goals)
20
-
21
- - 明确本轮不做什么:
22
-
23
- ## 关键场景 / 用户路径
24
-
25
- 1.
26
- 2.
27
- 3.
28
-
29
- ## Feature List
30
-
31
- | ID | Feature | Priority | Status | Acceptance | Notes |
32
- |----|---------|----------|--------|------------|-------|
33
- | F1 | | High | todo | | |
34
-
35
- ## 依赖(Dependencies)
36
-
37
- - 上游依赖:
38
- - 下游影响:
39
- - 文档/契约依赖:
40
-
41
- ## 风险(Risks)
42
-
43
- -
44
-
45
- ## 验证说明(Verification Notes)
46
-
47
- - 最低建议验证:
48
- - 加强验证:
49
- - 关键手工路径:
50
-
51
- ## Open Questions
52
-
53
- -
1
+ # Feature Spec 模板
2
+
3
+ ## 标题
4
+
5
+ ## 状态
6
+
7
+ - draft / active / completed
8
+
9
+ ## 背景(Background)
10
+
11
+ - 问题背景:
12
+ - 用户/协作者痛点:
13
+ - 与现有系统的关系:
14
+
15
+ ## 目标(Goal)
16
+
17
+ - 本 feature 要实现什么:
18
+
19
+ ## 非目标(Non-goals)
20
+
21
+ - 明确本轮不做什么:
22
+
23
+ ## 关键场景 / 用户路径
24
+
25
+ 1.
26
+ 2.
27
+ 3.
28
+
29
+ ## Feature List
30
+
31
+ | ID | Feature | Priority | Status | Acceptance | Notes |
32
+ |----|---------|----------|--------|------------|-------|
33
+ | F1 | | High | todo | | |
34
+
35
+ ## 依赖(Dependencies)
36
+
37
+ - 上游依赖:
38
+ - 下游影响:
39
+ - 文档/契约依赖:
40
+
41
+ ## 风险(Risks)
42
+
43
+ -
44
+
45
+ ## 验证说明(Verification Notes)
46
+
47
+ - 最低建议验证:
48
+ - 加强验证:
49
+ - 关键手工路径:
50
+
51
+ ## Open Questions
52
+
53
+ -