@tea-agent/loop-agent 0.44.0-next.1 → 0.44.0-next.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +379 -416
- package/dist/application/evaluation/budget.js +21 -0
- package/dist/application/evaluation/corpus-hash.js +10 -15
- package/dist/application/evaluation/corpus.js +2 -1
- package/dist/application/evaluation/frontend-browser-acceptance.js +77 -0
- package/dist/application/evaluation/frontend-corpus-browser-acceptance.js +175 -0
- package/dist/application/evaluation/frontend-gateway-evidence.js +226 -0
- package/dist/application/evaluation/frontend-pair-registration.js +143 -0
- package/dist/application/evaluation/frontend-paired-summary.js +150 -0
- package/dist/application/evaluation/frontend-run-observation.js +144 -0
- package/dist/application/evaluation/frontend-shared-evidence.js +105 -0
- package/dist/application/evaluation/types.js +45 -12
- package/dist/application/task-lifecycle/observe.js +26 -1
- package/dist/build-stamp.json +3 -3
- package/dist/cli/command-definitions.js +11 -0
- package/dist/cli/program.js +4 -0
- package/dist/commands/task-advance.js +3 -5
- package/dist/commands/task-source-prepare.js +13 -1
- package/dist/executors/dag-pi/guards.js +4 -0
- package/dist/executors/dag-pi/model-config.js +30 -0
- package/dist/executors/dag-pi/plan/fact-adoption.js +55 -0
- package/dist/{workflows/dag/frontend-plan-completeness.js → executors/dag-pi/plan/facts.js} +22 -28
- package/dist/executors/dag-pi/plan/finalize-tools.js +259 -0
- package/dist/executors/dag-pi/plan/ledger-contract.js +55 -0
- package/dist/executors/dag-pi/plan/record-tools.js +861 -0
- package/dist/executors/dag-pi/plan/schema.js +129 -0
- package/dist/executors/dag-pi/plan/session.js +1 -0
- package/dist/executors/dag-pi/plan/tool-helpers.js +16 -0
- package/dist/executors/dag-pi/tools/contract-tools.js +515 -0
- package/dist/executors/dag-pi/tools/design-terminal-tools.js +159 -0
- package/dist/executors/dag-pi/tools/plan-decision-tools.js +529 -0
- package/dist/executors/dag-pi/tools/review-terminal-tools.js +159 -0
- package/dist/executors/dag-pi/tools/scout-evidence-tools.js +270 -0
- package/dist/executors/dag-pi-executor.js +398 -3384
- package/dist/executors/pi-executor.js +6 -1
- package/dist/executors/pi-sdk-executor.js +112 -19
- package/dist/executors/shell-executor.js +88 -12
- package/dist/executors/shell-presets.js +1 -1
- package/dist/executors/shell-write-guard.js +26 -3
- package/dist/infrastructure/console/operation-store.js +48 -14
- package/dist/infrastructure/evaluation/corpus-store.js +37 -12
- package/dist/shared/file-identity.js +23 -0
- package/dist/shared/git-workspace-status.js +482 -0
- package/dist/shared/operator/capabilities.js +10 -5
- package/dist/shared/path-safety.js +2 -2
- package/dist/shared/wizard-local-telemetry.js +51 -0
- package/dist/task/config-types.js +22 -8
- package/dist/task/contract/project.js +13 -0
- package/dist/task/contract/schema.js +2 -7
- package/dist/task/frontend-preflight.js +1 -1
- package/dist/task/source-prepare/parse-intent.js +124 -5
- package/dist/task/source-prepare/prepare.js +6 -1
- package/dist/task/source-prepare/semantic-intake.js +18 -3
- package/dist/task/source-prepare/source-execution.js +65 -0
- package/dist/task/source-prepare/source-fidelity-pi.js +22 -9
- package/dist/task/source-prepare/source-provider-budget.js +290 -0
- package/dist/worker/console/chat/assistant-content.js +5 -34
- package/dist/worker/console/chat/chat-event-store.js +62 -10
- package/dist/worker/console/chat/context-insights.js +723 -0
- package/dist/worker/console/chat/conversation-nodes.js +383 -0
- package/dist/worker/console/chat/db-connections.js +854 -0
- package/dist/worker/console/chat/pi-runtime/custom-tools/operator-tools.js +1 -1
- package/dist/worker/console/chat/pi-runtime/custom-tools/sql-tools.js +655 -0
- package/dist/worker/console/chat/pi-runtime.js +445 -36
- package/dist/worker/console/chat/provider-error.js +0 -12
- package/dist/worker/console/chat/repo-browser.js +52 -4
- package/dist/worker/console/chat/routes.js +577 -72
- package/dist/worker/console/chat/sdd-data-alignment.js +8 -31
- package/dist/worker/console/chat/session-store.js +147 -19
- package/dist/worker/console/chat/shortcuts.js +7 -0
- package/dist/worker/console/chat/timeline-message-order.js +22 -0
- package/dist/worker/console/chat/tools.js +34 -0
- package/dist/worker/console/chat/turn-process.js +237 -66
- package/dist/worker/console/chat/user-turn-outline.js +19 -0
- package/dist/worker/console/console-update-runtime.js +2 -2
- package/dist/worker/console/dag-confirmation.js +3 -0
- package/dist/worker/console/dag-execution-receipt.js +3 -0
- package/dist/worker/console/operator-actions.js +32 -3
- package/dist/worker/console/operator-user-error.js +28 -1
- package/dist/worker/console/pi-readiness.js +4 -4
- package/dist/worker/console/prd-intake-bridge.js +5 -12
- package/dist/worker/console/recovery-cta.js +14 -14
- package/dist/worker/console/server.js +5 -1
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-8-j6y-sd.js → abnfDiagram-N423BO3Z-r1NAPU_5.js} +1 -1
- package/dist/worker/console/static/assets/{arc-eoQiMvuk.js → arc-dT5T4sVL.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-C4A3uMcI.js → architectureDiagram-T3A2C74G-CP_cOq46.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-D4zD2F-Q.js → blockDiagram-VBNYF7ZC-sToEZxEf.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-j1RkJziL.js → c4Diagram-5PPSVZJV-DSxwwi2m.js} +1 -1
- package/dist/worker/console/static/assets/channel-CyBY_yGk.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-YBHmhik1.js → chunk-2GRJ4B5K-B9fh0IkF.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-COfWyo9P.js → chunk-2Q5K7J3B-CAUNl-A6.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-I99OUkHY.js → chunk-5RXB4S5H-BomeqbNX.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-XKxoJNJ4.js → chunk-5VM5RSS4-BNAuTOLE.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DLT_cYx1.js → chunk-6Q2QTUOP-DfzjRD5y.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-CxcKZ9mV.js → chunk-GF5L2VYU-C3uE-yc2.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-V1EqXdjY.js → chunk-JWPE2WC7-C3sQMMYr.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-DebTtdFp.js → chunk-KBJHAD2P-D_AtEYQL.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-B-ivNRDf.js → chunk-RYQCIY6F-DW4TwhKv.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-DC_Ds11b.js → chunk-XXDRQBXY-CTQDmJcp.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-D5lN4E_E.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-D5lN4E_E.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-sWEqKwIb.js → cose-bilkent-JH36ORCC-iMqPuBsL.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BXa_dcu4.js → cynefin-VYW2F7L2-DktIuDWs.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-C-Mle84F.js → cynefinDiagram-MW4NZA55-BgVnjyEs.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-CXPDBITe.js → dagre-VZM6K2ZE-CR25E4bu.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-CC-WJQfa.js → diagram-7IWD3JNH-CPM2h5HY.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-CDAV5Vs4.js → diagram-B4RE2ZJO-DqF0x2g1.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-CmFiAcNz.js → diagram-LBJQPF4R-G8BYp2eb.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-DPBZHuyn.js → diagram-Q27KOJAE-BbC4kT_D.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-jUlm_Ds3.js → diagram-UB23O5K3-CKZwZ-G5.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-DWhQ3mfY.js → ebnfDiagram-BXEA7PRR-kJDmheia.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-Tr2gMqet.js → erDiagram-JOGREHBK-DFTVHyxB.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-DJjVQHPA.js → flowDiagram-UKHOOZJN-BqdN5_os.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-D74dQ4u0.js → ganttDiagram-PKOTCBZU-SYDjVakh.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-DwW0tZ0X.js → gitGraphDiagram-DS77QQ5N-Bf8bNpGA.js} +1 -1
- package/dist/worker/console/static/assets/index-B28Onmfy.css +1 -0
- package/dist/worker/console/static/assets/index-CTMZsDmh.js +486 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-ILCbxJyb.js → infoDiagram-6WML65LV-DIeAmJ45.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-DeuWBQ89.js → ishikawaDiagram-WSZJBQD7-oikqUAlo.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-CF5ih8Fk.js → journeyDiagram-NVQOT4AX-mKEF_xYT.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-C7yOSuRO.js → kanban-definition-27J2QSJJ-BdWJHPnN.js} +1 -1
- package/dist/worker/console/static/assets/{linear-BDZ9riWi.js → linear-DGRlieMH.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-7pKqYtpZ.js → mermaid.core-4P9yPC9c.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-LeJDybSU.js → mindmap-definition-FAOFIHXS-5PTSkos6.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-BJvT3pMD.js → pegDiagram-VL7TDLO6-DONIFpG5.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-_rGqpMan.js → pieDiagram-7S7Q4E2Y-D_Z4S70M.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-DPcSv5aA.js → quadrantDiagram-CIZ2JOQS-CAsjh8iY.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-Drxx4hkJ.js → railroadDiagram-AXF67PYL-Cx4Dd6ac.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-BCTUdU4z.js → requirementDiagram-LRYGKXZP-cQb7mwyH.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-B6wzbZmB.js → sankeyDiagram-W5VNT64P-Cd-DhUdf.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-BGt8d3QQ.js → sequenceDiagram-SI44F4Z6-AlKYRgIk.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-7nlhJKo7.js → sizeCapture-X5ZJPWSS-CUy_ET4e.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-Cv2stqMA.js → stateDiagram-OKZ733FA-CTuVe6Sa.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BsWhs8O7.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-qDAo4Yc1.js → swimlanes-SLNWSIFB-ChFLJb-v.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-CJcioYGH.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CKbDNKTr.js → timeline-definition-Z64GVDOM-DZZeiAPr.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-DI-9EHic.js → vennDiagram-T6HMQDX7-t4O91cZU.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-BrzzRDpX.js → wardleyDiagram-T6FBY63Y-CV5qGHZu.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-BclH5hGh.js → xychartDiagram-ELKLHX3M-DyXbytUI.js} +1 -1
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/console/static-src/app/console-types.js +9 -1
- package/dist/worker/console/static-src/operator-chat/animation-frame-batcher.js +38 -0
- package/dist/worker/console/static-src/operator-chat/chat-link.js +20 -0
- package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +186 -5
- package/dist/worker/console/static-src/operator-chat/chat-stream-continuity.js +101 -0
- package/dist/worker/console/static-src/operator-chat/compaction-message.js +18 -3
- package/dist/worker/console/static-src/operator-chat/context-insights-store.js +64 -0
- package/dist/worker/console/static-src/operator-chat/details-rail-surfaces.js +98 -0
- package/dist/worker/console/static-src/operator-chat/file-palette-nav.js +81 -0
- package/dist/worker/console/static-src/operator-chat/pending-user-message.js +17 -3
- package/dist/worker/console/static-src/operator-chat/process-label.js +27 -5
- package/dist/worker/console/static-src/operator-chat/tools-catalog.js +16 -7
- package/dist/worker/console/static-src/operator-chat/transcript-mode.js +21 -0
- package/dist/worker/console/static-src/operator-chat/turn-group-equality.js +4 -1
- package/dist/worker/console/static-src/operator-chat/turn-process-disclosure.js +13 -5
- package/dist/worker/console/static-src/operator-chat/turn-state-projection.js +166 -0
- package/dist/worker/console/static-src/operator-chat/turn-stream-controller.js +56 -2
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +211 -40
- package/dist/worker/console/static-src/operator-chat/useChatStream.js +124 -27
- package/dist/worker/console/static-src/operator-chat/useChatThread.js +88 -20
- package/dist/worker/console/static-src/operator-chat/useComposer.js +80 -6
- package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +13 -3
- package/dist/worker/console/static-src/operator-chat/useRuntimeControls.js +36 -17
- package/dist/worker/console/static-src/operator-chat/useRuntimeSnapshot.js +18 -0
- package/dist/worker/console/static-src/operator-chat/useWorkspaceBrowserGate.js +4 -0
- package/dist/worker/console/static-src/shell/console-update-reload.js +1 -1
- package/dist/worker/console/workspace-context.js +2 -0
- package/dist/worker/console/workspace-initialization.js +3 -3
- package/dist/worker/observability/read-model.js +23 -2
- package/dist/worker/observe/node-context-insights.js +479 -0
- package/dist/worker/observe/static/console-theme.css +174 -0
- package/dist/worker/observe/static/console-theme.js +36 -0
- package/dist/worker/observe/static/operator-chrome.css +85 -0
- package/dist/worker/observe/static/operator-chrome.js +51 -0
- package/dist/worker/scheduler/scheduled-goal-dispatch.js +3 -2
- package/dist/worker/scheduler/scheduled-goal-evidence.js +66 -3
- package/dist/worker/scheduler/scheduled-goal-store.js +10 -0
- package/dist/workflows/dag/budget-enforcement.js +31 -2
- package/dist/workflows/dag/frontend-closeout.js +3 -1
- package/dist/workflows/dag/frontend-contract-facts.js +11 -8
- package/dist/workflows/dag/frontend-design-policy.js +6 -6
- package/dist/workflows/dag/frontend-durable-tools.js +90 -70
- package/dist/workflows/dag/frontend-implementation-contract.js +146 -57
- package/dist/workflows/dag/frontend-plan-canary.js +66 -16
- package/dist/workflows/dag/frontend-plan-decision-contract.js +13 -21
- package/dist/workflows/dag/frontend-plan-progress.js +92 -0
- package/dist/workflows/dag/frontend-recovery-plan.js +10 -5
- package/dist/workflows/dag/frontend-recovery-run.js +51 -46
- package/dist/workflows/dag/frontend-repair-assertions.js +36 -0
- package/dist/workflows/dag/frontend-review-context.js +29 -1
- package/dist/workflows/dag/frontend-review-scopes.js +92 -2
- package/dist/workflows/dag/frontend-risk.js +8 -3
- package/dist/workflows/dag/frontend-root-observation.js +261 -0
- package/dist/workflows/dag/frontend-session-budget.js +52 -39
- package/dist/workflows/dag/frontend-session-context.js +10 -0
- package/dist/workflows/dag/frontend-test-execution-evidence.js +206 -48
- package/dist/workflows/dag/frontend-typed-event-store.js +11 -1
- package/dist/workflows/dag/frontend-verification-trace.js +6 -0
- package/dist/workflows/dag/frontend-writer-admission.js +3 -1
- package/dist/workflows/dag/init-hybrid.js +108 -37
- package/dist/workflows/dag/node-execution.js +11 -11
- package/dist/workflows/dag/output-protocol.js +1 -0
- package/dist/workflows/dag/rerun-feedback.js +35 -4
- package/dist/workflows/dag/rerun-task.js +62 -66
- package/dist/workflows/dag/runner.js +58 -12
- package/dist/workflows/dag/types.js +15 -8
- package/dist/workflows/loop/benchmark.js +11 -8
- package/docs/README.md +1 -1
- package/docs/architecture/runtime-boundaries.md +1 -1
- package/docs/governance/harness-methodology-verification.md +11 -0
- package/docs/templates/backend-test-dag.json +5 -4
- package/docs/templates/frontend-implementation-contract.schema.json +31 -11
- package/package.json +6 -4
- package/skills/frontend-design-review/SKILL.md +8 -11
- package/skills/frontend-design-review/references/review-checklist.md +3 -4
- package/skills/frontend-review/SKILL.md +5 -1
- package/skills/loop-agent/references/command-reference.md +8 -0
- package/skills/loop-agent/references/hybrid-dag.md +1 -1
- package/dist/worker/console/static/assets/channel-ChE7y-cx.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-C01TCf2X.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-C01TCf2X.js +0 -1
- package/dist/worker/console/static/assets/index-BWkIfcrK.css +0 -1
- package/dist/worker/console/static/assets/index-Cdkvw_H6.js +0 -469
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DC7V5vcq.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-Bwy4QUTO.js +0 -8
|
@@ -174,6 +174,7 @@
|
|
|
174
174
|
"network",
|
|
175
175
|
"rate-limit",
|
|
176
176
|
"unavailable",
|
|
177
|
+
"upstream-unavailable",
|
|
177
178
|
"empty-output",
|
|
178
179
|
"output-limit",
|
|
179
180
|
"output-too-large",
|
|
@@ -196,7 +197,7 @@
|
|
|
196
197
|
"writePolicy": "read-only",
|
|
197
198
|
"shell": {
|
|
198
199
|
"commands": [
|
|
199
|
-
"node -e \"eval(require('zlib').inflateRawSync(Buffer.from('
|
|
200
|
+
"node -e \"eval(require('zlib').inflateRawSync(Buffer.from('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','base64')).toString('utf8'))\""
|
|
200
201
|
],
|
|
201
202
|
"timeoutMs": 60000,
|
|
202
203
|
"cwd": "."
|
|
@@ -397,7 +398,7 @@
|
|
|
397
398
|
"writePolicy": "read-only",
|
|
398
399
|
"shell": {
|
|
399
400
|
"commands": [
|
|
400
|
-
"node -e \"eval(require('zlib').inflateRawSync(Buffer.from('
|
|
401
|
+
"node -e \"eval(require('zlib').inflateRawSync(Buffer.from('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','base64')).toString('utf8'))\""
|
|
401
402
|
],
|
|
402
403
|
"timeoutMs": 60000,
|
|
403
404
|
"cwd": "."
|
|
@@ -449,7 +450,7 @@
|
|
|
449
450
|
"verification-before-completion"
|
|
450
451
|
],
|
|
451
452
|
"complexity": "MED",
|
|
452
|
-
"subtaskPromptTemplate": "Convert the single frozen Markdown module `{{item.markdownPath}}` into one self-contained pytest module. Before writing, also read the run-owned Markdown plan artifact at `{{item.planReadPath}}` and use its explicit API target/environment table as the authoritative fallback base URL for every module. A task/Markdown `API_BASE_URL` target takes precedence over project README dev-server URLs; never infer a backend API fallback from a frontend/Vite port such as localhost:3000. After reading the module Markdown, the run-owned plan artifact, and the bounded pytest config/conftest, immediately use write tools to create the single frozen file `{{item.pytestPath}}`. Define any bounded HTTP client fixture, request logging/redaction/truncation helper and payload builders needed by this module inside that same file; do not import generated testcase/**/helpers/** or testcase/**/factories/** assets. Do not end after analysis or planning. Do not modify Markdown, conftest, helpers/factories, or any other module's pytest script.\n\nOutput budget protocol (hard, max output <=16K per turn): Write exactly the frozen `{{item.pytestPath}}`. Never paste full Python modules into assistant chat. Do not merge or split modules. Do not reduce params/assertions/skips to fit. If OUTPUT_LIMIT_RECOVERY is injected, continue only listed missing/broken scripts.\n\nAlign every variant pytest.param payload with the Markdown scenario intent (empty/missing/null/length/pattern/enum/wrong-type/nominal). Prefer literal payloads over Faker for intent-critical fields so pre-execution scenario-param checks can verify them. Hard contract: intent=enum-invalid MUST pass a concrete invalid value literal (string/number/boolean), never `_OMIT`/None/missing key; intent=missing/empty may use `_OMIT` or delete the key; intent=custom-literal:trim|whitespace-padded requires a leading/trailing whitespace string with non-empty trimmed content (all-whitespace belongs to empty/whitespace-only, not trim); intent=custom-literal:ACTIVE|ARCHIVED requires the exact enum string, never descriptive tokens like filter-active; intent=max/min/max+1 should pass a repeated-string length expression, a bare length number N, or a helper named _*_LEN{N} / _*_MAX_LENGTH / _*_OVER_LENGTH — never a bare 1 for oversize. Hard contract: request payload dicts may only contain DTO field keys from Payload Allowed Paths; never put expect/expected/echo_* helper keys inside the JSON body dict. Path/query/header identifiers and scenario-control metadata (including `id`, expected codes, and selector labels) must stay in separate pytest parameters and helper arguments; never merge them into a DTO patch or JSON body unless that exact path is allowed by the Markdown payload contract. Normalize the configured API base URL with `rstrip(\"/\")` (or equivalently join exactly one slash) before appending endpoint paths; generated requests must never contain a `//api/...` path. When the bound source documents a concrete non-secret local API URL, generated clients must use it as the fallback in `os.environ.get(\"API_BASE_URL\", \"<documented-url>\")`; do not require an otherwise-uninjected environment variable or fail setup solely because it is absent. Missing-field helpers must remove keys idempotently with `payload.pop(field, None)`, never `del payload[field]`, because optional fields may already be absent.\n\nFor every response contract that requires an object or pagination envelope, first assert that each envelope/data value is a dict and that required keys exist, then index fields and assert values. Never let an incidental KeyError or list/string TypeError stand in for the explicit response-shape contract failure.\n\nEnsure every automatable final Markdown Case ID in this module appears in exactly one primary pytest test function or pytest test class method region, using the exact `primary symbol` declared by Markdown. Skip evidence-only meta Cases that declare `脚本/primary symbol=无` with empty variants; do not invent a business pytest symbol for them. 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. A Case with exactly one variant Test Point still needs one literal `pytest.param(..., id=\"TP-...\")` row; never leave a single-variant Case as a bare function with the TP only in the docstring. Use a literal direct `pytest.param(..., id=...)` expression for every row; never hide or wrap it behind `_post_case`, `_put_case`, row-factory functions, comprehensions, generators, or dynamically returned parameter lists; 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. Governance-only cross-cutting bindings such as writeSet compliance, execution count, report existence, or orchestration state are metadata-only in business pytest: preserve their IDs in `Cross-Cutting-Test-Points`, but never assert `__file__`, filesystem placement, pytest invocation count, Harness state, or report artifacts inside the business test. Harness-owned evidence verifies those bindings. The first statement inside every primary symbol must be a triple-quoted docstring containing exact lines `Case-ID: BE-...`, `Assertion-Test-Points: TP-...;TP-...` and `Cross-Cutting-Test-Points: TP-...;TP-...` (use `none` when empty), for example `def test_BE_X_001():\n \"\"\"\n Case-ID: BE-X-001\n Assertion-Test-Points: TP-X-ASSERT\n Cross-Cutting-Test-Points: none\n \"\"\"`. Module/class docstrings, comments before `def`, and singular `Assertion-Test-Point:` comments never bind a Test Point. Implement request dictionaries so their direct and nested key paths and enum literals exactly satisfy the Case `Payload Required Paths`, `Payload Allowed Paths`, and `Payload Enum`; for `Payload Contract: none`, do not invent a JSON/body DTO. GET/list filters still declare query fields in those payload labels when the Case varies `params=`/`query=` keys. Python `True`/`False` may implement JSON/OpenAPI `true`/`false` query or body booleans. GET/DELETE setup journeys may create resources, but their setup DTO must not change the target operation's no-body payload contract. 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 the generated pytest file so it corresponds one-to-one with its source Markdown module file: this module stem `{{item.stem}}` maps to exactly the frozen `{{item.pytestPath}}`. The <module> stem is the Markdown filename without the `.md` extension, lowercased and with non-alphanumeric characters replaced by underscores. For example, `resource_notes` → `testcase/test_resource_notes.py`, `health` → `testcase/test_health.py`. If Markdown automation mapping names a different path than this module stem path, still write the frozen manifest pytest path and do not invent prefixes. 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\nScenario Partition slots: every `TP-<Partition ID>-...` variant Test Point declared by this module's Markdown MUST become exactly one literal direct `pytest.param(..., id=\"TP-<Partition ID>-...\")` row with the exact slot ID; the not-in-set slot passes a concrete literal absent from the documented Domain (e.g. `UNKNOWN_TYPE`) — never `_OMIT`, never a descriptive token. Never split one slot into multiple params or merge several slots under a family TP id. Slot filtering requests hit the documented list endpoint with the slot value as the query/path filter.\n\nKeep this module self-contained: define module-local fixtures and helpers directly in `{{item.pytestPath}}`, so pytest discovers every fixture dependency without external plugin registration. 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. Recursively redact sensitive values and apply bounded truncation before logging.\n\nMaterialize every automatable Markdown Case exactly once as one canonical primary pytest symbol. Preserve every explicit variant Test Point as a stable pytest.param id and every assertion/cross-cutting binding as declared. Build request payloads from the effective Markdown test data literally: keep all declared DTO keys, nested shapes, enum values, missing/null/boundary variants and business-state preconditions; never substitute guessed convenience fields or rename contract fields. Never assert an identifier's concrete Python/JSON type unless the Markdown or bound contract explicitly declares that type; when only presence is required, accept any non-null scalar identifier and serialize it safely into the path. For a nonexistent-resource 404 Case whose identifier syntax/type is not declared, obtain a syntactically valid identifier from a live create response and delete it before the 404 request; never invent an arbitrary UUID/text identifier that may fail path conversion with 400. Respect every local helper's actual return signature: never tuple-unpack a scalar status/id/helper result, and never treat a tuple response as a scalar.\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`.",
|
|
453
|
+
"subtaskPromptTemplate": "Convert the single frozen Markdown module `{{item.markdownPath}}` into one self-contained pytest module. Before writing, also read the run-owned Markdown plan artifact at `{{item.planReadPath}}` and use its explicit API target/environment table as the authoritative fallback base URL for every module. A task/Markdown `API_BASE_URL` target takes precedence over project README dev-server URLs; never infer a backend API fallback from a frontend/Vite port such as localhost:3000. After reading the module Markdown, the run-owned plan artifact, and the bounded pytest config/conftest, immediately use write tools to create the single frozen file `{{item.pytestPath}}`. Define any bounded HTTP client fixture, request logging/redaction/truncation helper and payload builders needed by this module inside that same file; do not import generated testcase/**/helpers/** or testcase/**/factories/** assets. Do not end after analysis or planning. Do not modify Markdown, conftest, helpers/factories, or any other module's pytest script.\n\nOutput budget protocol (hard, max output <=16K per turn): Write exactly the frozen `{{item.pytestPath}}`. Never paste full Python modules into assistant chat. Do not merge or split modules. Do not reduce params/assertions/skips to fit. If OUTPUT_LIMIT_RECOVERY is injected, continue only listed missing/broken scripts.\n\nAlign every variant pytest.param payload with the Markdown scenario intent (empty/missing/null/length/pattern/enum/wrong-type/nominal). Prefer literal payloads over Faker for intent-critical fields so pre-execution scenario-param checks can verify them. Hard contract: intent=enum-invalid MUST pass a concrete invalid value literal (string/number/boolean), never `_OMIT`/None/missing key; intent=missing/empty may use `_OMIT` or delete the key; intent=custom-literal:trim|whitespace-padded requires a leading/trailing whitespace string with non-empty trimmed content (all-whitespace belongs to empty/whitespace-only, not trim); intent=custom-literal:ACTIVE|ARCHIVED requires the exact enum string, never descriptive tokens like filter-active; intent=max/min/max+1 should pass a repeated-string length expression, a bare length number N, or a helper named _*_LEN{N} / _*_MAX_LENGTH / _*_OVER_LENGTH — never a bare 1 for oversize. Hard contract: request payload dicts may only contain DTO field keys from Payload Allowed Paths; never put expect/expected/echo_* helper keys inside the JSON body dict. Path/query/header identifiers and scenario-control metadata (including `id`, expected codes, and selector labels) must stay in separate pytest parameters and helper arguments; never merge them into a DTO patch or JSON body unless that exact path is allowed by the Markdown payload contract. Normalize the configured API base URL with `rstrip(\"/\")` (or equivalently join exactly one slash) before appending endpoint paths; generated requests must never contain a `//api/...` path. When the bound source documents a concrete non-secret local API URL, generated clients must use it as the fallback in `os.environ.get(\"API_BASE_URL\", \"<documented-url>\")`; do not require an otherwise-uninjected environment variable or fail setup solely because it is absent. Missing-field helpers must remove keys idempotently with `payload.pop(field, None)`, never `del payload[field]`, because optional fields may already be absent.\n\nFor every response contract that requires an object or pagination envelope, first assert that each envelope/data value is a dict and that required keys exist, then index fields and assert values. Never let an incidental KeyError or list/string TypeError stand in for the explicit response-shape contract failure.\n\nEnsure every automatable final Markdown Case ID in this module appears in exactly one primary pytest test function or pytest test class method region, using the exact `primary symbol` declared by Markdown. Skip evidence-only meta Cases that declare `脚本/primary symbol=无` with empty variants; do not invent a business pytest symbol for them. 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. A Case with exactly one variant Test Point still needs one literal `pytest.param(..., id=\"TP-...\")` row; never leave a single-variant Case as a bare function with the TP only in the docstring. Use a literal direct `pytest.param(..., id=...)` expression for every row; never hide or wrap it behind `_post_case`, `_put_case`, row-factory functions, comprehensions, generators, or dynamically returned parameter lists; 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. Governance-only cross-cutting bindings such as writeSet compliance, execution count, report existence, or orchestration state are metadata-only in business pytest: preserve their IDs in `Cross-Cutting-Test-Points`, but never assert `__file__`, filesystem placement, pytest invocation count, Harness state, or report artifacts inside the business test. Harness-owned evidence verifies those bindings. 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). Implement request dictionaries so their direct and nested key paths and enum literals exactly satisfy the Case `Payload Required Paths`, `Payload Allowed Paths`, and `Payload Enum`; for `Payload Contract: none`, do not invent a JSON/body DTO. GET/list filters still declare query fields in those payload labels when the Case varies `params=`/`query=` keys. Python `True`/`False` may implement JSON/OpenAPI `true`/`false` query or body booleans. GET/DELETE setup journeys may create resources, but their setup DTO must not change the target operation's no-body payload contract. 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 the generated pytest file so it corresponds one-to-one with its source Markdown module file: this module stem `{{item.stem}}` maps to exactly the frozen `{{item.pytestPath}}`. The <module> stem is the Markdown filename without the `.md` extension, lowercased and with non-alphanumeric characters replaced by underscores. For example, `resource_notes` → `testcase/test_resource_notes.py`, `health` → `testcase/test_health.py`. If Markdown automation mapping names a different path than this module stem path, still write the frozen manifest pytest path and do not invent prefixes. 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\nScenario Partition slots: every `TP-<Partition ID>-...` variant Test Point declared by this module's Markdown MUST become exactly one literal direct `pytest.param(..., id=\"TP-<Partition ID>-...\")` row with the exact slot ID; the not-in-set slot passes a concrete literal absent from the documented Domain (e.g. `UNKNOWN_TYPE`) — never `_OMIT`, never a descriptive token. Never split one slot into multiple params or merge several slots under a family TP id. Slot filtering requests hit the documented list endpoint with the slot value as the query/path filter.\n\nKeep this module self-contained: define module-local fixtures and helpers directly in `{{item.pytestPath}}`, so pytest discovers every fixture dependency without external plugin registration. 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. Recursively redact sensitive values and apply bounded truncation before logging.\n\nMaterialize every automatable Markdown Case exactly once as one canonical primary pytest symbol. Preserve every explicit variant Test Point as a stable pytest.param id and every assertion/cross-cutting binding as declared. Build request payloads from the effective Markdown test data literally: keep all declared DTO keys, nested shapes, enum values, missing/null/boundary variants and business-state preconditions; never substitute guessed convenience fields or rename contract fields. Never assert an identifier's concrete Python/JSON type unless the Markdown or bound contract explicitly declares that type; when only presence is required, accept any non-null scalar identifier and serialize it safely into the path. For a nonexistent-resource 404 Case whose identifier syntax/type is not declared, obtain a syntactically valid identifier from a live create response and delete it before the 404 request; never invent an arbitrary UUID/text identifier that may fail path conversion with 400. Respect every local helper's actual return signature: never tuple-unpack a scalar status/id/helper result, and never treat a tuple response as a scalar.\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`.",
|
|
453
454
|
"outputContract": "Write exactly the frozen pytest module file `{{item.pytestPath}}` whose actual test function region contains the exact Case ID, preferably in the function name or docstring. the frozen `{{item.markdownPath}}` maps one-to-one to `{{item.pytestPath}}`; never merge or split modules. No JSON and no pytest execution.",
|
|
454
455
|
"toolProfile": "write",
|
|
455
456
|
"writePolicy": "exclusive",
|
|
@@ -529,7 +530,7 @@
|
|
|
529
530
|
],
|
|
530
531
|
"runIf": "$.nodes['assess-backend-pytest-collection-shell'].json.repairEligible == true",
|
|
531
532
|
"complexity": "MED",
|
|
532
|
-
"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. The direct upstream JSON includes authoritative `repairPaths` and bounded `repairFindings`; treat both as the complete mandatory checklist without searching for a run directory or report file. Treat any upstream line such as `Repair paths: testcase/test_x.py` as equivalent authoritative repairPaths evidence. Directly read and edit that testcase path; do not search for separate root-level `contracts/**`, guess a DAG run directory, or require another report artifact. If the read tool successfully returns the testcase file, the path exists—continue the bounded repair and never later claim that file is absent.\n\nInitial status REPAIRABLE means at least one listed finding remains: `already-satisfied` is forbidden, and you must produce a non-empty bounded diff on repairPaths before returning `IMPLEMENTATION_OUTCOME: changed`. Fix only readiness-proven generated testcase-local defects on initial facts repairPaths: create exact safe missing mapped test_*.py paths, repair syntax/import/symbol/decorator/parameterization, close generated fixture dependencies/plugin registration, and repair initial Markdown-to-pytest correspondence findings. Use this deterministic repair map instead of reading analyzer implementation: findings about `Case-ID`, `Assertion-Test-Points`, or `Cross-Cutting-Test-Points` are fixed by
|
|
533
|
+
"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. The direct upstream JSON includes authoritative `repairPaths` and bounded `repairFindings`; treat both as the complete mandatory checklist without searching for a run directory or report file. Treat any upstream line such as `Repair paths: testcase/test_x.py` as equivalent authoritative repairPaths evidence. Directly read and edit that testcase path; do not search for separate root-level `contracts/**`, guess a DAG run directory, or require another report artifact. If the read tool successfully returns the testcase file, the path exists—continue the bounded repair and never later claim that file is absent.\n\nInitial status REPAIRABLE means at least one listed finding remains: `already-satisfied` is forbidden, and you must produce a non-empty bounded diff on repairPaths before returning `IMPLEMENTATION_OUTCOME: changed`. Fix only readiness-proven generated testcase-local defects on initial facts repairPaths: create exact safe missing mapped test_*.py paths, repair syntax/import/symbol/decorator/parameterization, close generated fixture dependencies/plugin registration, and repair initial Markdown-to-pytest correspondence findings. Use this deterministic repair map instead of reading analyzer implementation: findings about `Case-ID`, `Assertion-Test-Points`, or `Cross-Cutting-Test-Points` are fixed by editing the declared primary symbol docstring metadata lines; variant binding findings are fixed in the literal direct `pytest.param(..., id=\"TP-...\")` row; primary-symbol cardinality/name findings are fixed in the function name or duplicate primary symbols; script mismatch is fixed only on the authoritative assessment repairPaths; payload findings are fixed in request payload construction. Do not read controller `src/**` or inspect JS/TS analyzer code. Do not search for `testcase/**/README.md`. Never invent a business pytest symbol for evidence-only Markdown Cases that declare `脚本/primary symbol=无` with empty variants. For fixture defects inspect both provider and importer listed by repairPaths; fix ScopeMismatch by aligning fixture scopes or inlining request-scoped values so module fixtures never depend on function fixtures; when a shared fixture depends on sibling fixtures, register the whole provider module through an exact pytest_plugins declaration rather than importing only the outer fixture. Do not create unrelated pytest scripts.\n\nThis is the single pytest incremental synchronization round. The `Findings` in `reports/backend-test-pytest-collection-initial.md` are the mandatory repair checklist: resolve every repairable listed finding on every authoritative `Repair paths` file before considering any other advisory evidence, and never substitute an unrelated scenario-param cleanup for a listed correspondence/collection defect. For every assessment-listed path, compare the effective Markdown Case/Test Points/test data and its `Payload Contract`/`Payload Required Paths`/`Payload Allowed Paths`/`Payload Enum` labels with the generated module. Incrementally add or repair only missing symbols, params, assertions and payload builders. Repair every assessment-listed missing nested path, unexpected key and enum mismatch; preserve exact DTO keys, nested shapes, enum/boundary literals, operation transport and business preconditions; remove guessed replacement keys only when the effective Markdown proves the exact contract. Keep path/query/header identifiers and scenario-control metadata separate from DTO patches and JSON bodies; an `id` used for a path target must be passed to the request path/helper, never inserted into a body patch unless `id` is explicitly listed in Payload Allowed Paths. Flatten every variant into a literal direct `pytest.param(..., id=\"TP-...\")` row; replace `_post_case`/`_put_case` or other parameter-row factories because correspondence and scenario readiness require the actual row values and IDs to be statically visible. Also repair helper call sites to match their defined return signatures; do not tuple-unpack a helper that returns one scalar value.\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\nUse local edit only on assessment-listed paths; keep summaries short; never rewrite unrelated modules.\n\nDo not reinterpret requirements beyond the effective Markdown and bounded assessment diagnostics. 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.",
|
|
533
534
|
"executor": "pi",
|
|
534
535
|
"role": "implementer",
|
|
535
536
|
"toolProfile": "write",
|
|
@@ -386,26 +386,18 @@
|
|
|
386
386
|
"additionalProperties": false,
|
|
387
387
|
"required": [
|
|
388
388
|
"id",
|
|
389
|
-
"type",
|
|
390
389
|
"commandLabel",
|
|
391
390
|
"file",
|
|
392
391
|
"requirementIds",
|
|
393
|
-
"uiStates"
|
|
392
|
+
"uiStates",
|
|
393
|
+
"mode",
|
|
394
|
+
"commandId"
|
|
394
395
|
],
|
|
395
396
|
"properties": {
|
|
396
397
|
"id": {
|
|
397
398
|
"type": "string",
|
|
398
399
|
"minLength": 1
|
|
399
400
|
},
|
|
400
|
-
"type": {
|
|
401
|
-
"enum": [
|
|
402
|
-
"static",
|
|
403
|
-
"unit",
|
|
404
|
-
"component",
|
|
405
|
-
"integration",
|
|
406
|
-
"mock"
|
|
407
|
-
]
|
|
408
|
-
},
|
|
409
401
|
"commandLabel": {
|
|
410
402
|
"type": "string",
|
|
411
403
|
"minLength": 1
|
|
@@ -436,6 +428,34 @@
|
|
|
436
428
|
"type": "string",
|
|
437
429
|
"minLength": 1
|
|
438
430
|
}
|
|
431
|
+
},
|
|
432
|
+
"mode": {
|
|
433
|
+
"enum": [
|
|
434
|
+
"static",
|
|
435
|
+
"behavior"
|
|
436
|
+
]
|
|
437
|
+
},
|
|
438
|
+
"commandId": {
|
|
439
|
+
"type": "string",
|
|
440
|
+
"minLength": 1
|
|
441
|
+
},
|
|
442
|
+
"scope": {
|
|
443
|
+
"enum": [
|
|
444
|
+
"unit",
|
|
445
|
+
"component",
|
|
446
|
+
"integration"
|
|
447
|
+
]
|
|
448
|
+
},
|
|
449
|
+
"evidenceLevel": {
|
|
450
|
+
"enum": [
|
|
451
|
+
"unit",
|
|
452
|
+
"mounted",
|
|
453
|
+
"real-integration"
|
|
454
|
+
]
|
|
455
|
+
},
|
|
456
|
+
"boundary": {
|
|
457
|
+
"type": "string",
|
|
458
|
+
"minLength": 1
|
|
439
459
|
}
|
|
440
460
|
}
|
|
441
461
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tea-agent/loop-agent",
|
|
3
|
-
"version": "0.44.0-next.
|
|
3
|
+
"version": "0.44.0-next.10",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"loop-agent": "bin/loop-agent.js",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"prepack": "npm run build",
|
|
59
59
|
"prepublishOnly": "node scripts/check-npm-publish-policy.mjs && npm run typecheck && npm run test:full && npm run build",
|
|
60
60
|
"lint": "npm run typecheck",
|
|
61
|
-
"typecheck": "tsc --noEmit && npm run console:typecheck",
|
|
61
|
+
"typecheck": "node --max-old-space-size=4096 ./node_modules/typescript/bin/tsc --noEmit && npm run console:typecheck",
|
|
62
62
|
"test": "node scripts/run-tests.mjs",
|
|
63
63
|
"test:full": "node scripts/run-tests.mjs --full",
|
|
64
64
|
"dogfood:backend": "tsx scripts/backend-dogfood-campaign.ts",
|
|
@@ -77,14 +77,16 @@
|
|
|
77
77
|
"@deepseek-ai/cordis": "4.0.1",
|
|
78
78
|
"@deepseek-ai/dsh-host-directory-picker-native": "0.1.1-rc.2",
|
|
79
79
|
"@deepseek-ai/dsh-invariants": "0.1.1-rc.2",
|
|
80
|
-
"@earendil-works/pi-ai": "0.
|
|
81
|
-
"@earendil-works/pi-coding-agent": "0.
|
|
80
|
+
"@earendil-works/pi-ai": "0.84.4",
|
|
81
|
+
"@earendil-works/pi-coding-agent": "0.84.4",
|
|
82
82
|
"@xterm/addon-fit": "^0.11.0",
|
|
83
83
|
"@xterm/xterm": "^6.0.0",
|
|
84
84
|
"commander": "^12.1.0",
|
|
85
85
|
"katex": "^0.16.47",
|
|
86
86
|
"mermaid": "^11.16.1",
|
|
87
|
+
"mysql2": "^3.24.4",
|
|
87
88
|
"node-pty": "^1.2.0-beta.15",
|
|
89
|
+
"pg": "^8.23.0",
|
|
88
90
|
"playwright-core": "^1.63.0",
|
|
89
91
|
"rehype-highlight": "^7.0.2",
|
|
90
92
|
"rehype-katex": "^7.0.1",
|
|
@@ -15,17 +15,17 @@ Do not rediscover sources, search specification roots or invent connector result
|
|
|
15
15
|
|
|
16
16
|
## Authoritative Terminal
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
Use `replace:true` for revisions. The terminal automatically includes saved findings;
|
|
20
|
-
do not repeat their array. Correct rejected calls, then commit one successful terminal:
|
|
18
|
+
Use `record_design_finding` with stable IDs; correct rejected calls before committing one terminal, which includes saved findings:
|
|
21
19
|
|
|
22
20
|
- `approve_design` when no blocking design defect remains;
|
|
23
21
|
- `request_design_changes` when a blocker exists. It must include a typed
|
|
24
22
|
`issueCategory`, at least one `evidenceRef`, and non-empty findings (saved or supplied).
|
|
25
23
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
Correct findings before completing their scope. Identical replay is safe; `replace:true` requires an existing ID and an unfinished scope.
|
|
25
|
+
|
|
26
|
+
Optional `finding.repairAssertions` may name frozen obligations, e.g. `[{"check":"state-present","token":"loading","source":"AC-1"}]`. Invalid assertions retain the blocker; passing checks still requires semantic review.
|
|
27
|
+
|
|
28
|
+
Only the typed terminal controls the outcome. No `VERDICT:` line, JSON verdict or revision patch. Requested changes end this run; recovery owns follow-up.
|
|
29
29
|
|
|
30
30
|
Check every execution group against its members' complete outcomes. Permissions,
|
|
31
31
|
thresholds and error paths remain independent ACs; a shared VT must prove them all.
|
|
@@ -47,12 +47,9 @@ Knowledge-base absence is advisory if relevant rules from either openspec
|
|
|
47
47
|
specification directory were read and applied. Block skipped fallback, unresolved
|
|
48
48
|
conflict, or unresolved UI decisions.
|
|
49
49
|
|
|
50
|
-
## Method
|
|
51
|
-
|
|
52
|
-
Map criteria to steps/files/states/checks, audit paths/evidence, classify Blocking
|
|
53
|
-
or Advisory, and never edit files.
|
|
50
|
+
## Method
|
|
54
51
|
|
|
55
|
-
|
|
52
|
+
Audit criteria, steps, files, states and checks; classify Blocking/Advisory. Never edit files.
|
|
56
53
|
|
|
57
54
|
Read only the canonical contract (or its indexed, hash-bound sections) and any exact
|
|
58
55
|
evidence paths bound in its upstream context. Successful paired reads are the only proof that a specification was read;
|
|
@@ -9,9 +9,8 @@
|
|
|
9
9
|
## Project Fit
|
|
10
10
|
|
|
11
11
|
- Reuse components, hooks, API helpers, mocks, schemas, router patterns, tokens, and theme rules.
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
- Record source status, query terms, paths/headings, conflicts, authorized deps, and allowed paths for both.
|
|
12
|
+
- Audit frozen source status and exact contract/readSet references. Empty knowledge queries require upstream fallback evidence or a recorded gap. Do not search specification roots; report missing required evidence to its upstream owner.
|
|
13
|
+
- Check the recorded source status, query terms, exact paths/headings, conflicts, authorized deps, and allowed paths.
|
|
15
14
|
- Component selection conformance: every UI purpose must be declared in the contract `uiComponentChoices[]`. `specified` must carry a non-empty `specReference { path, section, line }` hitting a supported openspec/ai_workspace spec; `new` must declare a deviation rationale with `specReference` null; a spec-defined component must not be silently replaced or self-invented without a declared deviation.
|
|
16
15
|
|
|
17
16
|
## Interaction / Quality
|
|
@@ -37,7 +36,7 @@
|
|
|
37
36
|
|
|
38
37
|
## Verdict Matrix
|
|
39
38
|
|
|
40
|
-
- Request revision for coverage gaps, unsafe scope, unauthorized deps, unresolved required interaction, missing required verification,
|
|
39
|
+
- Request revision for coverage gaps, unsafe scope, unauthorized deps, unresolved required interaction, missing required verification, missing required upstream specification fallback evidence, unsafe/missing Mock strategy, or Mock evidence presented as real integration.
|
|
41
40
|
- Request revision for component selection non-conformance: spec-defined components silently replaced or self-invented without a declared deviation, `uiComponentChoices` missing for UI-visible work, or a `uiComponentChoices` `specReference.path` not cited in the `openspec-citations` block / not actually read.
|
|
42
41
|
- Knowledge-base unavailable but relevant OpenSpec or `ai_workspace/` rules applied is advisory only.
|
|
43
42
|
- Optional cleanup that cannot affect acceptance is advisory.
|
|
@@ -10,7 +10,7 @@ references:
|
|
|
10
10
|
# Frontend Review
|
|
11
11
|
|
|
12
12
|
Use `contracts/frontend-review-context.json`, its hash-bound contract index and diff,
|
|
13
|
-
and
|
|
13
|
+
and the supplied hash-bound test-source/report scopes (including unchanged tests). Read the findings guide and capacity diagnostic;
|
|
14
14
|
use indexed sections when advised. Do not reopen task sources, plans, OpenSpec,
|
|
15
15
|
design-review prose or `ai_workspace/`.
|
|
16
16
|
|
|
@@ -25,6 +25,10 @@ rejected calls, then commit one successful terminal:
|
|
|
25
25
|
write, or unmet acceptance criterion. It must include a typed `issueCategory`,
|
|
26
26
|
at least one `evidenceRef`, and non-empty findings (saved or supplied).
|
|
27
27
|
|
|
28
|
+
Save and correct every finding before completing its scope. An identical finding is an idempotent replay; `replace:true` requires an existing ID and cannot modify a completed scope/terminal.
|
|
29
|
+
|
|
30
|
+
Optional `finding.repairAssertions` may name frozen obligations, e.g. `[{"check":"state-present","token":"loading","source":"AC-1"}]`. Invalid assertions retain the blocker; passing checks still requires semantic review.
|
|
31
|
+
|
|
28
32
|
Only the typed terminal controls the outcome; no `VERDICT:` line or JSON verdict.
|
|
29
33
|
Requested changes end this run; the recovery controller owns follow-up.
|
|
30
34
|
|
|
@@ -119,6 +119,14 @@ export CODE_AGENT_PI_BACKEND=cli-only # 紧急回滚:纯 CLI 路径
|
|
|
119
119
|
|
|
120
120
|
SDK 回归或 SDK 可选依赖不可用时用 `cli-only` 诊断。CLI fallback 路径须与现有 workflow 行为兼容。
|
|
121
121
|
|
|
122
|
+
### 提升完成 run 的证据
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
loop-agent promote-run <task-id> --run-id <run-id>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
`promote-run` 把已完成 DAG 或 one-shot run 的确定性证据提升进任务产物(`修改记录.md`、`验证结果.md`),不重新执行业务步骤。仅在目标 run 已终态后使用;`dag reconcile-tasks` 的 `promotion-drift` 提示会给出该命令与对应 `run-id`。它只写任务产物,不改源码、不替代验收结论。
|
|
129
|
+
|
|
122
130
|
### 初始化与旧项目更新
|
|
123
131
|
|
|
124
132
|
用户中文表达到命令的映射(与目标项目 `AGENTS.md` 的“自然语言入口路由”保持一致):
|
|
@@ -215,7 +215,7 @@ planner/scout/reviewer/verifier/closeout 角色的安全只读 Pi 节点可声
|
|
|
215
215
|
- 节点终态聚合全部 attempts 的耗时、Token 与事件数;当前 backoff 等待会占用该节点的并发槽。
|
|
216
216
|
- 未声明 `retryPolicy` 的历史 DAG 行为不变(单次执行,不新增 attempt artifact)。
|
|
217
217
|
|
|
218
|
-
实现:`src/workflows/dag/retry-policy.ts`、`node-execution.ts`、`validate.ts`。测试:`npx vitest run test/dag-node-retry.test.ts test/dag-validate.test.ts test/dag-init-hybrid.test.ts`。
|
|
218
|
+
实现:`src/workflows/dag/retry-policy.ts`、`node-execution.ts`、`validate.ts`。测试:`npx vitest run test/dag-node-retry.test.ts test/dag-validate.test.ts test/dag-init-hybrid.test.ts test/dag-init-hybrid-build.test.ts`。
|
|
219
219
|
|
|
220
220
|
### Evidence summary guidance(practice convention — 非 runtime)
|
|
221
221
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ag as o,ah as n}from"./mermaid.core-7pKqYtpZ.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-GF5L2VYU-CxcKZ9mV.js";import{_ as i}from"./mermaid.core-7pKqYtpZ.js";import"./chunk-5VM5RSS4-XKxoJNJ4.js";import"./chunk-XXDRQBXY-DC_Ds11b.js";import"./chunk-KBJHAD2P-DebTtdFp.js";import"./chunk-2GRJ4B5K-YBHmhik1.js";import"./index-Cdkvw_H6.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-GF5L2VYU-CxcKZ9mV.js";import{_ as i}from"./mermaid.core-7pKqYtpZ.js";import"./chunk-5VM5RSS4-XKxoJNJ4.js";import"./chunk-XXDRQBXY-DC_Ds11b.js";import"./chunk-KBJHAD2P-DebTtdFp.js";import"./chunk-2GRJ4B5K-YBHmhik1.js";import"./index-Cdkvw_H6.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
|