@tea-agent/loop-agent 0.39.0-beta.0 → 0.39.0-beta.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/AGENTS.md +4 -1
- package/CHANGELOG.md +248 -95
- package/README.md +9 -5
- package/bin/loop-agent.js +7 -3
- package/dist/application/task-lifecycle/advance.js +12 -0
- package/dist/application/task-lifecycle/recommendations.js +13 -2
- package/dist/build-stamp.json +3 -3
- package/dist/cli/command-definitions.js +23 -5
- package/dist/cli/program.js +21 -2
- package/dist/cli/update/notifier.js +2 -2
- package/dist/cli/update/runtime-activity.js +1 -29
- package/dist/cli.js +2 -1
- package/dist/commands/client-recovery.js +3 -0
- package/dist/commands/dag-follow-up.js +138 -0
- package/dist/commands/dag-rerun.js +55 -1
- package/dist/commands/init-model-catalog.js +464 -0
- package/dist/commands/init-upgrade.js +265 -97
- package/dist/commands/init.js +455 -28
- package/dist/commands/inspect-next.js +8 -0
- package/dist/commands/task-advance.js +19 -0
- package/dist/executors/dag-pi-executor.js +2306 -61
- package/dist/executors/pi-executor.js +7 -0
- package/dist/executors/pi-extension-resolver.js +233 -0
- package/dist/executors/pi-playwright-cli-tool.js +74 -28
- package/dist/executors/pi-read-budget-policy.js +239 -0
- package/dist/executors/pi-sdk-executor.js +180 -33
- package/dist/executors/shell-executor.js +1249 -224
- package/dist/executors/shell-write-guard.js +14 -0
- package/dist/executors/workspace-write-snapshot.js +68 -0
- package/dist/infrastructure/harness/atomic-write.js +23 -0
- package/dist/shared/dag-failure-category.js +150 -0
- package/dist/shared/dag-prompt-override.js +27 -0
- package/dist/shared/openspec-spec.js +70 -4
- package/dist/shared/operator/capabilities.js +39 -0
- package/dist/shared/playwright-cli-command-policy.js +15 -0
- package/dist/shared/update/console-notifier.js +100 -0
- package/dist/{cli → shared}/update/npm-client.js +70 -15
- package/dist/{cli → shared}/update/state.js +41 -13
- package/dist/task/config-types.js +50 -5
- package/dist/task/contract/apply.js +11 -1
- package/dist/task/contract/constants.js +2 -0
- package/dist/task/contract/hash.js +3 -0
- package/dist/task/contract/observe.js +25 -4
- package/dist/task/contract/paths.js +2 -1
- package/dist/task/contract/project.js +18 -1
- package/dist/task/contract/schema.js +4 -1
- package/dist/task/contract/transaction.js +12 -0
- package/dist/task/frontend-project-capability.js +199 -18
- package/dist/task/source-prepare/completeness.js +188 -0
- package/dist/task/source-prepare/fragment-inventory.js +477 -0
- package/dist/task/source-prepare/index.js +3 -0
- package/dist/task/source-prepare/ledger-reconciliation.js +127 -0
- package/dist/task/source-prepare/ledger-review.js +214 -0
- package/dist/task/source-prepare/ledger.js +545 -0
- package/dist/task/source-prepare/parse-intent.js +24 -4
- package/dist/task/source-prepare/prepare.js +298 -1
- package/dist/task/source-prepare/semantic-intake.js +25 -5
- package/dist/task/source-prepare/source-fidelity-pi.js +384 -0
- package/dist/task/source-prepare/types.js +22 -0
- package/dist/task/source-references.js +22 -1
- package/dist/worker/cli.js +18 -2
- package/dist/worker/console/chat/chat-event-store.js +62 -4
- package/dist/worker/console/chat/context-panel.js +7 -0
- package/dist/worker/console/chat/deferred-turn.js +12 -0
- package/dist/worker/console/chat/operation-card.js +8 -1
- package/dist/worker/console/chat/pi-console-config.js +81 -10
- package/dist/worker/console/chat/pi-runtime.js +264 -16
- package/dist/worker/console/chat/provider-error.js +98 -0
- package/dist/worker/console/chat/routes.js +298 -32
- package/dist/worker/console/chat/session-stats.js +179 -0
- package/dist/worker/console/chat/session-store.js +93 -63
- package/dist/worker/console/chat/todos.js +115 -0
- package/dist/worker/console/chat/tool-preview.js +42 -0
- package/dist/worker/console/chat/turn-process.js +20 -55
- package/dist/worker/console/chat/user-questions.js +266 -0
- package/dist/worker/console/chat/workspace-landing.js +14 -0
- package/dist/worker/console/console-handoff.js +82 -0
- package/dist/worker/console/console-update-and-init.js +115 -0
- package/dist/worker/console/console-update-runtime.js +84 -0
- package/dist/worker/console/dag-execution-receipt.js +33 -0
- package/dist/worker/console/draft-store.js +49 -0
- package/dist/worker/console/frontend-human-decision-adapter.js +19 -0
- package/dist/worker/console/frontend-split-operation-adapter.js +20 -0
- package/dist/worker/console/index.js +3 -0
- package/dist/worker/console/inspect-split.js +18 -0
- package/dist/worker/console/native-directory-picker.js +13 -0
- package/dist/worker/console/operation-run-facts.js +19 -3
- package/dist/worker/console/operation-store.js +227 -7
- package/dist/worker/console/operator-actions.js +388 -0
- package/dist/worker/console/operator-surface-health.js +1 -0
- package/dist/worker/console/operator-user-error.js +2 -2
- package/dist/worker/console/prd-intake-bridge.js +13 -0
- package/dist/worker/console/routes.js +355 -3
- package/dist/worker/console/security.js +67 -13
- package/dist/worker/console/server.js +609 -164
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-C4kVYweA.js → abnfDiagram-N423BO3Z-BAsjg7ew.js} +1 -1
- package/dist/worker/console/static/assets/{arc-Bj2M8iO5.js → arc-CyIlrwZw.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-CLlXe4-6.js → architectureDiagram-T3A2C74G-Bo4tobhH.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-psEp5xH0.js → blockDiagram-VBNYF7ZC-Dfpow9gu.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-DeKcOCGJ.js → c4Diagram-5PPSVZJV-DPmzG_B4.js} +1 -1
- package/dist/worker/console/static/assets/channel-DSrJAn0-.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-K0C744p1.js → chunk-2GRJ4B5K-pKQpB1UW.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-xbNw4J9-.js → chunk-2Q5K7J3B-5n9YYquZ.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-DjLaSDUO.js → chunk-5RXB4S5H-DP3CtA2a.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-CtiPlKel.js → chunk-5VM5RSS4-DYxMJPUy.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DZtolir7.js → chunk-6Q2QTUOP-CS3D50Io.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-CPcdNeew.js → chunk-GF5L2VYU-gSdDfo5_.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-NgHc6V37.js → chunk-JWPE2WC7-A48q0ZNt.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-DQ_T-hg8.js → chunk-KBJHAD2P-ow8Mm3DY.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DgLsxcVP.js → chunk-RYQCIY6F-CMKfLWYE.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-UrVoM9z1.js → chunk-XXDRQBXY-BiTBdQPX.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-DeMmPl0_.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-DeMmPl0_.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-CLkYvTb3.js → cose-bilkent-JH36ORCC-Cm7exRz_.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BwT_xKrE.js → cynefin-VYW2F7L2-D9O5qGOu.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-Bi9tuzif.js → cynefinDiagram-MW4NZA55-CkvQnako.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-BCIqkWBV.js → dagre-VZM6K2ZE-B1rzp7CB.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-Dip6l9_Z.js → diagram-7IWD3JNH-BP07Ipcc.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-B-xkh_wK.js → diagram-B4RE2ZJO-BlPzweQb.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-DZO0kTt_.js → diagram-LBJQPF4R-CxPa7n0S.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-D6ZplNbZ.js → diagram-Q27KOJAE-CMTZs53A.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-BPekbhoS.js → diagram-UB23O5K3-CxG_X52r.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-BtmaJpK5.js → ebnfDiagram-BXEA7PRR-D8axtJM0.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-6DS0Xc44.js → erDiagram-JOGREHBK-DIsGzn7b.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-CihnROSm.js → flowDiagram-UKHOOZJN-CU9zkDG0.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-CZC4zOE2.js → ganttDiagram-PKOTCBZU-DCjTmz5P.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-Dq1fhzGN.js → gitGraphDiagram-DS77QQ5N-BksdmFzg.js} +1 -1
- package/dist/worker/console/static/assets/index-B-O5ChYq.css +1 -0
- package/dist/worker/console/static/assets/index-CfnY8AQx.js +407 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-DlSl4BGx.js → infoDiagram-6WML65LV-CGzzzJtL.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-snnzFl_U.js → ishikawaDiagram-WSZJBQD7-BdseB80N.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-BDE7qpMx.js → journeyDiagram-NVQOT4AX-DM9gsgha.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-CD2Ci04G.js → kanban-definition-27J2QSJJ-3q-_9R2b.js} +1 -1
- package/dist/worker/console/static/assets/{linear-DdnapKIH.js → linear-B8N-Mxsd.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-BVjAT9b8.js → mermaid.core-EPIHUUsu.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-D0yJk-zA.js → mindmap-definition-FAOFIHXS-CxwO12aa.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-BVo9tFP-.js → pegDiagram-VL7TDLO6-bPqbVX6Y.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-DnOV-mZ_.js → pieDiagram-7S7Q4E2Y-KzqIvzeX.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-CzUJo58i.js → quadrantDiagram-CIZ2JOQS-CyofpWiV.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-Bvikrolh.js → railroadDiagram-AXF67PYL-cTWJvLTP.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-DtaSVCap.js → requirementDiagram-LRYGKXZP-BK--q27B.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-C2c9A0wW.js → sankeyDiagram-W5VNT64P-C0SDOHXK.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DmXJcU7r.js → sequenceDiagram-SI44F4Z6-Cong6YIo.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-B4GUFW92.js → sizeCapture-X5ZJPWSS-DUVkgZx8.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-Dsad2MXf.js → stateDiagram-OKZ733FA-C7XgxuZg.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-Dzbnd5oX.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-DGq48Fbi.js → swimlanes-SLNWSIFB-D9Ayvwcy.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BY0hHk6G.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CSSi6OFf.js → timeline-definition-Z64GVDOM-Byb000cH.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-BqyzPrWv.js → vennDiagram-T6HMQDX7-DMLegPt4.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-DlznVb6S.js → wardleyDiagram-T6FBY63Y-ChMMeOsP.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-CfBcgJ_K.js → xychartDiagram-ELKLHX3M-bEMEPisW.js} +1 -1
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/console/static-src/active-run-badge.js +17 -0
- package/dist/worker/console/static-src/app/console-types.js +68 -4
- package/dist/worker/console/static-src/app/useConsoleShell.js +30 -12
- package/dist/worker/console/static-src/app/useOperatorActions.js +41 -6
- package/dist/worker/console/static-src/app/useRecoveryConsole.js +45 -10
- package/dist/worker/console/static-src/app/useRunProgress.js +47 -0
- package/dist/worker/console/static-src/app/useTaskWizard.js +74 -2
- package/dist/worker/console/static-src/night/useNightBoard.js +8 -5
- package/dist/worker/console/static-src/operator-chat/cards/failure-category-advice.js +25 -0
- package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +140 -8
- package/dist/worker/console/static-src/operator-chat/details-dag-actions.js +122 -0
- package/dist/worker/console/static-src/operator-chat/input-history.js +76 -0
- package/dist/worker/console/static-src/operator-chat/mutation-gate.js +1 -1
- package/dist/worker/console/static-src/operator-chat/refs.js +3 -0
- package/dist/worker/console/static-src/operator-chat/runtime-selection-labels.js +27 -0
- package/dist/worker/console/static-src/operator-chat/turn-submission.js +16 -3
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +168 -72
- package/dist/worker/console/static-src/operator-chat/useChatStream.js +102 -21
- package/dist/worker/console/static-src/operator-chat/useChatThread.js +184 -4
- package/dist/worker/console/static-src/operator-chat/useComposer.js +32 -0
- package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +63 -9
- package/dist/worker/console/static-src/operator-chat/useWorkspaceBrowserGate.js +4 -0
- package/dist/worker/console/static-src/operator-chat/workspace-layout-mode.js +3 -3
- package/dist/worker/console/static-src/pages/tasks/run-id-resolution.js +79 -0
- package/dist/worker/console/static-src/pages/tasks/run-ownership-verify.js +23 -0
- package/dist/worker/console/static-src/pages/tasks/run-panel-progress.js +110 -0
- package/dist/worker/console/static-src/shell/useWorkspaces.js +299 -0
- package/dist/worker/console/static-src/shell/workspace-route.js +337 -0
- package/dist/worker/console/workspace-context.js +344 -0
- package/dist/worker/console/workspace-registry.js +214 -0
- package/dist/worker/loop-agent/loop-agent-client.js +7 -3
- package/dist/worker/materialize/frontend-split-task-materializer.js +72 -0
- package/dist/worker/materialize/harness-task-lineage.js +5 -2
- package/dist/worker/observability/init-runtime-activity.js +26 -0
- package/dist/worker/observability/read-model.js +22 -0
- package/dist/worker/observe/node-input.js +160 -3
- package/dist/worker/observe/node-process.js +377 -0
- package/dist/worker/observe/routes.js +224 -3
- package/dist/worker/observe/server.js +4 -0
- package/dist/worker/observe/shell-handler-keys.js +34 -0
- package/dist/worker/observe/static/api.js +90 -4
- package/dist/worker/observe/static/app.js +18 -70
- package/dist/worker/observe/static/constants.js +8 -1
- package/dist/worker/observe/static/dag-history-labels.js +4 -0
- package/dist/worker/observe/static/dag-node-purpose.d.ts +6 -0
- package/dist/worker/observe/static/dag-node-purpose.js +208 -0
- package/dist/worker/observe/static/format.js +60 -0
- package/dist/worker/observe/static/index.html +6 -1
- package/dist/worker/observe/static/inspect-workspace.js +307 -0
- package/dist/worker/observe/static/markdown-render.js +20 -1
- package/dist/worker/observe/static/operator-chrome.css +145 -20
- package/dist/worker/observe/static/operator-chrome.d.ts +20 -3
- package/dist/worker/observe/static/operator-chrome.js +330 -96
- package/dist/worker/observe/static/prompt-restart-candidates.d.ts +18 -0
- package/dist/worker/observe/static/prompt-restart-candidates.js +36 -0
- package/dist/worker/observe/static/router.d.ts +46 -0
- package/dist/worker/observe/static/router.js +25 -1
- package/dist/worker/observe/static/state.d.ts +50 -0
- package/dist/worker/observe/static/state.js +184 -1
- package/dist/worker/observe/static/styles.css +395 -0
- package/dist/worker/observe/static/views/dag-graph.js +4 -2
- package/dist/worker/observe/static/views/dag-inspector.js +1067 -9
- package/dist/worker/observe/static/views/dag.d.ts +13 -0
- package/dist/worker/observe/static/views/dag.js +14 -5
- package/dist/worker/observe/static/views/dashboard.js +6 -4
- package/dist/worker/observe/static/views/failures.js +5 -2
- package/dist/worker/observe/static/views/night.js +2 -2
- package/dist/worker/observe/static/views/pool.js +1 -0
- package/dist/worker/observe/static/views/run.js +3 -1
- package/dist/worker/observe/static/views/session-timeline.js +78 -9
- package/dist/worker/observe/static/views/task.js +56 -1
- package/dist/workflows/dag/backend-test-case-coverage-analysis.js +49 -3
- package/dist/workflows/dag/backend-test-markdown-workflow.js +176 -1
- package/dist/workflows/dag/backend-test-pytest-collection.js +98 -14
- package/dist/workflows/dag/backend-test-writer-completeness.js +10 -5
- package/dist/workflows/dag/contract-output-registry.js +15 -0
- package/dist/workflows/dag/contract-validator-registrations.js +1 -2
- package/dist/workflows/dag/dynamic-runtime/loop-until.js +1 -1
- package/dist/workflows/dag/dynamic-runtime/map.js +1 -1
- package/dist/workflows/dag/failure-category.js +7 -116
- package/dist/workflows/dag/frontend-closeout.js +221 -0
- package/dist/workflows/dag/frontend-design-policy.js +400 -0
- package/dist/workflows/dag/frontend-human-decision.js +182 -0
- package/dist/workflows/dag/frontend-implementation-contract.js +534 -178
- package/dist/workflows/dag/frontend-plan-render.js +24 -0
- package/dist/workflows/dag/frontend-prewrite-gate.js +371 -393
- package/dist/workflows/dag/frontend-provider-capability-matrix.js +159 -0
- package/dist/workflows/dag/frontend-recovery-capsule.js +455 -0
- package/dist/workflows/dag/frontend-recovery-controller.js +202 -0
- package/dist/workflows/dag/frontend-recovery-lineage.js +178 -0
- package/dist/workflows/dag/frontend-recovery-plan.js +17 -10
- package/dist/workflows/dag/frontend-recovery-run.js +33 -20
- package/dist/workflows/dag/frontend-repair.js +7 -424
- package/dist/workflows/dag/frontend-review-context.js +288 -14
- package/dist/workflows/dag/frontend-review-findings.js +270 -0
- package/dist/workflows/dag/frontend-risk.js +15 -2
- package/dist/workflows/dag/frontend-shadow-dual-write.js +814 -0
- package/dist/workflows/dag/frontend-shape-capsule-store.js +191 -0
- package/dist/workflows/dag/frontend-shape-facts.js +409 -0
- package/dist/workflows/dag/frontend-shape.js +427 -0
- package/dist/workflows/dag/frontend-source-fidelity-ledger.js +108 -0
- package/dist/workflows/dag/frontend-split-application-service.js +203 -0
- package/dist/workflows/dag/frontend-split-orchestrator.js +899 -0
- package/dist/workflows/dag/frontend-test-case-checklist.js +30 -4
- package/dist/workflows/dag/frontend-test-case-manifest.js +11 -4
- package/dist/workflows/dag/frontend-test-case-quality.js +11 -16
- package/dist/workflows/dag/frontend-test-environment-probe.js +230 -0
- package/dist/workflows/dag/frontend-test-html-report.js +3 -1
- package/dist/workflows/dag/frontend-test-l5-report.js +3 -1
- package/dist/workflows/dag/frontend-test-layout.js +159 -0
- package/dist/workflows/dag/frontend-test-markdown.js +61 -0
- package/dist/workflows/dag/frontend-test-result-contract.js +188 -42
- package/dist/workflows/dag/frontend-test-standard-scenarios.js +70 -0
- package/dist/workflows/dag/frontend-typed-event-store.js +452 -0
- package/dist/workflows/dag/frontend-typed-event-transaction.js +180 -0
- package/dist/workflows/dag/frontend-verification-trace.js +52 -17
- package/dist/workflows/dag/frontend-worktree-diff.js +250 -17
- package/dist/workflows/dag/frontend-writer-admission.js +272 -0
- package/dist/workflows/dag/frontend-writer-status.js +244 -0
- package/dist/workflows/dag/init-hybrid.js +984 -618
- package/dist/workflows/dag/interrupt-request.js +10 -3
- package/dist/workflows/dag/lifecycle.js +3 -3
- package/dist/workflows/dag/node-execution.js +468 -34
- package/dist/workflows/dag/prompt.js +44 -19
- package/dist/workflows/dag/recovery-lease.js +80 -0
- package/dist/workflows/dag/report.js +37 -1
- package/dist/workflows/dag/rerun-feedback.js +124 -1
- package/dist/workflows/dag/rerun-plan.js +144 -5
- package/dist/workflows/dag/rerun-run.js +81 -6
- package/dist/workflows/dag/rerun-task.js +29 -0
- package/dist/workflows/dag/retry-policy.js +318 -8
- package/dist/workflows/dag/runner.js +429 -122
- package/dist/workflows/dag/scheduler.js +114 -16
- package/dist/workflows/dag/structured-output-repair.js +712 -0
- package/dist/workflows/dag/types.js +321 -31
- package/dist/workflows/dag/upstream-artifacts.js +0 -4
- package/dist/workflows/dag/validate.js +92 -32
- package/docs/README.md +2 -0
- package/docs/architecture/evolution.md +45 -0
- package/docs/init-surface.manifest.json +9 -0
- package/docs/operations/README.md +1 -1
- package/docs/operations/local-development-environment.md +21 -0
- package/docs/templates/README.md +2 -1
- package/docs/templates/agent-dag-report.schema.json +8 -2
- package/docs/templates/agent-dag.schema.json +45 -1
- package/docs/templates/frontend-implementation-contract.schema.json +684 -24
- package/docs/templates/frontend-test-case-checklist.md +2 -2
- package/docs/templates/frontend-test-dag.json +8 -10
- package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +1 -1
- package/docs/templates/init-managed-agents.md +13 -3
- package/docs/templates/spec-registry.schema.json +45 -0
- package/harness.json +3 -3
- package/package.json +7 -1
- package/scripts/next-info.mjs +356 -0
- package/scripts/next-publish-gate.mjs +238 -0
- package/scripts/release-source-binding.mjs +251 -0
- package/skills/codebase-scout/SKILL.md +1 -1
- package/skills/fe-test-ui-scout/SKILL.md +65 -0
- package/skills/fe-test-ui-scout/references/ledger-schema.md +62 -0
- package/skills/fe-test-ui-scout/references/recon-protocol.md +54 -0
- package/skills/frontend-bounded-implement/SKILL.md +8 -14
- package/skills/frontend-design-review/SKILL.md +20 -41
- package/skills/frontend-implementation/SKILL.md +3 -4
- package/skills/frontend-implementation/references/design-spec.md +15 -10
- package/skills/frontend-implementation/references/node-contracts.md +23 -13
- package/skills/frontend-review/SKILL.md +22 -14
- package/skills/frontend-review/references/review-findings.md +6 -7
- package/skills/loop-agent/references/command-reference.md +12 -4
- package/skills/loop-agent/references/hybrid-dag.md +8 -1
- package/skills/playwright-cli/SKILL.md +23 -1
- package/skills/playwright-cli-case-generator/SKILL.md +29 -8
- package/dist/worker/console/static/assets/channel-CPF4N7pf.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-C2DwA_Y1.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-C2DwA_Y1.js +0 -1
- package/dist/worker/console/static/assets/index-DTZOKgAn.js +0 -404
- package/dist/worker/console/static/assets/index-Ya5FE7cD.css +0 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-B8FB_cNk.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-CrZYaWfx.js +0 -8
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { DEFAULT_DAG_EXECUTOR_MODELS, ENV_VAR_NAME_PATTERN, dagCommandPolicyAllows, resolveDagCommandPolicy, } from "./types.js";
|
|
1
|
+
import { DEFAULT_DAG_EXECUTOR_MODELS, ENV_VAR_NAME_PATTERN, dagCommandPolicyAllows, dagPiExtensionIdSchema, resolveDagCommandPolicy, } from "./types.js";
|
|
2
2
|
import { resolveShellCommands } from "../../executors/shell-executor.js";
|
|
3
3
|
import { pathMatchesPattern } from "../../shared/git-progress.js";
|
|
4
4
|
import { resolveRepairTaskForGate } from "./repair-artifact.js";
|
|
5
5
|
import { topoSortToRanks } from "./topo.js";
|
|
6
|
-
import { isSafeReadOnlyPiRetryCandidate, isWriterEmptyDiffRetryCandidate, isWriterTransportRetryCandidate, INCOMPLETE_WRITE_SET_RETRY_CATEGORY, WRITER_CLEAN_TIMEOUT_RETRY_CATEGORY, WRITER_EMPTY_DIFF_RETRY_CATEGORY, } from "./retry-policy.js";
|
|
6
|
+
import { isSafeReadOnlyPiRetryCandidate, isWriterEmptyDiffRetryCandidate, isWriterTransportRetryCandidate, INCOMPLETE_WRITE_SET_RETRY_CATEGORY, WRITER_CLEAN_TIMEOUT_RETRY_CATEGORY, WRITER_EMPTY_DIFF_RETRY_CATEGORY, CONTEXT_OVERFLOW_RETRY_CATEGORY, } from "./retry-policy.js";
|
|
7
7
|
import { isBackendTestCompletenessRetryCandidate } from "./backend-test-writer-completeness.js";
|
|
8
|
+
import { defaultFrontendTestLayout, frontendTestLayoutFromSpec, } from "./frontend-test-layout.js";
|
|
8
9
|
const GOVERNANCE_WARNING_TYPES = new Set([
|
|
9
10
|
"read-only-missing-artifacts-forbidden",
|
|
10
11
|
"read-only-prompt-mentions-artifact-writes",
|
|
@@ -463,8 +464,12 @@ function validateShellTaskConfig(task, spec, issues) {
|
|
|
463
464
|
if (commands.length === 0 &&
|
|
464
465
|
!shell.jsonArtifactGate &&
|
|
465
466
|
!shell.backendTestPipeline &&
|
|
466
|
-
!shell.
|
|
467
|
+
!shell.frontendDesignPolicy &&
|
|
468
|
+
!shell.frontendWriterAdmission &&
|
|
469
|
+
!shell.frontendCloseout &&
|
|
467
470
|
!shell.frontendBrowserToolPreflight &&
|
|
471
|
+
!shell.frontendTestStandardScenarios &&
|
|
472
|
+
!shell.frontendTestEnvironmentProbe &&
|
|
468
473
|
!shell.frontendVerificationBundle &&
|
|
469
474
|
!shell.frontendReviewContext &&
|
|
470
475
|
!shell.frontendTestCaseChecklist &&
|
|
@@ -534,18 +539,26 @@ function validateShellTaskConfig(task, spec, issues) {
|
|
|
534
539
|
}
|
|
535
540
|
}
|
|
536
541
|
}
|
|
537
|
-
if (shell.
|
|
538
|
-
const sourceNodeIds = [
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
542
|
+
if (shell.frontendDesignPolicy) {
|
|
543
|
+
const sourceNodeIds = [shell.frontendDesignPolicy.planFromNodeId];
|
|
544
|
+
for (const sourceNodeId of new Set(sourceNodeIds)) {
|
|
545
|
+
if (!task.depends_on.includes(sourceNodeId)) {
|
|
546
|
+
issues.push({
|
|
547
|
+
type: "missing-dependency",
|
|
548
|
+
message: `shell task ${task.id} frontendDesignPolicy source ${sourceNodeId} must be a direct dependency`,
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
if (shell.frontendWriterAdmission) {
|
|
554
|
+
const sourceNodeIds = shell.frontendWriterAdmission.designReviewFromNodeId
|
|
555
|
+
? [shell.frontendWriterAdmission.designReviewFromNodeId]
|
|
556
|
+
: [];
|
|
544
557
|
for (const sourceNodeId of new Set(sourceNodeIds)) {
|
|
545
558
|
if (!task.depends_on.includes(sourceNodeId)) {
|
|
546
559
|
issues.push({
|
|
547
560
|
type: "missing-dependency",
|
|
548
|
-
message: `shell task ${task.id}
|
|
561
|
+
message: `shell task ${task.id} frontendWriterAdmission source ${sourceNodeId} must be a direct dependency`,
|
|
549
562
|
});
|
|
550
563
|
}
|
|
551
564
|
}
|
|
@@ -643,12 +656,18 @@ function validateRetryPolicyTaskConfig(task, issues) {
|
|
|
643
656
|
}
|
|
644
657
|
if (isWriterTransportCandidate) {
|
|
645
658
|
const categories = new Set(task.retryPolicy.retryCategories);
|
|
659
|
+
const allowedWriterTransportCategories = new Set([
|
|
660
|
+
WRITER_CLEAN_TIMEOUT_RETRY_CATEGORY,
|
|
661
|
+
CONTEXT_OVERFLOW_RETRY_CATEGORY,
|
|
662
|
+
]);
|
|
663
|
+
const allAllowed = [...categories].every((category) => allowedWriterTransportCategories.has(category));
|
|
646
664
|
if (task.retryPolicy.maxAttempts !== 2 ||
|
|
647
|
-
categories.size
|
|
665
|
+
categories.size === 0 ||
|
|
666
|
+
!allAllowed ||
|
|
648
667
|
!categories.has(WRITER_CLEAN_TIMEOUT_RETRY_CATEGORY)) {
|
|
649
668
|
issues.push({
|
|
650
669
|
type: "invalid-retry-policy",
|
|
651
|
-
message: `task ${task.id} writer transport retryPolicy must use exactly two total attempts and only
|
|
670
|
+
message: `task ${task.id} writer transport retryPolicy must use exactly two total attempts and only writer-clean-timeout (plus optional context-overflow)`,
|
|
652
671
|
});
|
|
653
672
|
}
|
|
654
673
|
}
|
|
@@ -678,22 +697,23 @@ function validateWriterOutcomePolicyTaskConfig(task, issues) {
|
|
|
678
697
|
});
|
|
679
698
|
}
|
|
680
699
|
}
|
|
681
|
-
function isFrontendEvidenceWriteSet(writeSet) {
|
|
700
|
+
function isFrontendEvidenceWriteSet(writeSet, layout = defaultFrontendTestLayout()) {
|
|
682
701
|
const entries = writeSet ?? [];
|
|
683
702
|
if (entries.length === 0)
|
|
684
703
|
return false;
|
|
704
|
+
const prefix = `${layout.evidenceDir}/`;
|
|
705
|
+
const glob = `${layout.evidenceDir}/**`;
|
|
685
706
|
return entries.every((entry) => {
|
|
686
707
|
const normalized = entry.trim().replace(/\\/g, "/").replace(/^\.\//, "");
|
|
687
|
-
return
|
|
688
|
-
normalized.startsWith("testcase/frontend/evidence/"));
|
|
708
|
+
return normalized === glob || normalized.startsWith(prefix);
|
|
689
709
|
});
|
|
690
710
|
}
|
|
691
|
-
function isFrontendBrowserExecutorTask(task) {
|
|
711
|
+
function isFrontendBrowserExecutorTask(task, layout = defaultFrontendTestLayout()) {
|
|
692
712
|
const skills = task.skills ?? [];
|
|
693
713
|
return (task.executor === "pi" &&
|
|
694
714
|
task.toolProfile === "write" &&
|
|
695
715
|
skills.includes("playwright-cli") &&
|
|
696
|
-
isFrontendEvidenceWriteSet(task.writeSet));
|
|
716
|
+
isFrontendEvidenceWriteSet(task.writeSet, layout));
|
|
697
717
|
}
|
|
698
718
|
function taskMentionsPlaywrightCliContract(task) {
|
|
699
719
|
const prompt = `${task.subtask_prompt}\n${task.outputContract ?? ""}`;
|
|
@@ -705,10 +725,11 @@ function taskMentionsPlaywrightCliContract(task) {
|
|
|
705
725
|
* - capability is granted without skill/prompt contract or outside evidence writeSet
|
|
706
726
|
* - non-browser nodes receive command capability
|
|
707
727
|
*/
|
|
708
|
-
function validateCommandPolicyTaskConfig(task, issues) {
|
|
728
|
+
function validateCommandPolicyTaskConfig(task, issues, spec) {
|
|
729
|
+
const layout = frontendTestLayoutFromSpec(spec);
|
|
709
730
|
const policy = resolveDagCommandPolicy(task.commandPolicy);
|
|
710
731
|
const allowsPlaywright = dagCommandPolicyAllows(task.commandPolicy, "playwright-cli");
|
|
711
|
-
const isBrowserExecutor = isFrontendBrowserExecutorTask(task);
|
|
732
|
+
const isBrowserExecutor = isFrontendBrowserExecutorTask(task, layout);
|
|
712
733
|
if (isBrowserExecutor && !allowsPlaywright) {
|
|
713
734
|
issues.push({
|
|
714
735
|
type: "invalid-command-policy",
|
|
@@ -739,10 +760,10 @@ function validateCommandPolicyTaskConfig(task, issues) {
|
|
|
739
760
|
message: `task ${task.id} playwright-cli command capability requires prompt/outputContract to reference playwright_cli`,
|
|
740
761
|
});
|
|
741
762
|
}
|
|
742
|
-
if (!isFrontendEvidenceWriteSet(task.writeSet)) {
|
|
763
|
+
if (!isFrontendEvidenceWriteSet(task.writeSet, layout)) {
|
|
743
764
|
issues.push({
|
|
744
765
|
type: "invalid-command-policy",
|
|
745
|
-
message: `task ${task.id} playwright-cli command capability requires frontend evidence writeSet under
|
|
766
|
+
message: `task ${task.id} playwright-cli command capability requires frontend evidence writeSet under ${layout.evidenceDir}/`,
|
|
746
767
|
});
|
|
747
768
|
}
|
|
748
769
|
if (task.toolProfile !== "write") {
|
|
@@ -753,7 +774,7 @@ function validateCommandPolicyTaskConfig(task, issues) {
|
|
|
753
774
|
}
|
|
754
775
|
}
|
|
755
776
|
}
|
|
756
|
-
function validateDynamicChildCommandPolicy(task, issues) {
|
|
777
|
+
function validateDynamicChildCommandPolicy(task, issues, spec) {
|
|
757
778
|
const expansion = task.dynamicExpansion;
|
|
758
779
|
if (!expansion)
|
|
759
780
|
return;
|
|
@@ -774,7 +795,7 @@ function validateDynamicChildCommandPolicy(task, issues) {
|
|
|
774
795
|
writeSet: child.writeSet,
|
|
775
796
|
outputContract: child.outputContract,
|
|
776
797
|
};
|
|
777
|
-
validateCommandPolicyTaskConfig(synthetic, issues);
|
|
798
|
+
validateCommandPolicyTaskConfig(synthetic, issues, spec);
|
|
778
799
|
}
|
|
779
800
|
function validateDecisionGateTaskConfig(task, issues) {
|
|
780
801
|
if (!task.decisionGate?.enabled) {
|
|
@@ -881,12 +902,13 @@ export function collectForbiddenExecutorIssues(spec, forbiddenExecutors) {
|
|
|
881
902
|
}));
|
|
882
903
|
}
|
|
883
904
|
/** Revalidate a rendered dynamic child before it enters state or executes. */
|
|
884
|
-
export function assertValidMaterializedDagTask(task) {
|
|
905
|
+
export function assertValidMaterializedDagTask(task, parentSpec) {
|
|
885
906
|
const issues = [];
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
907
|
+
const spec = {
|
|
908
|
+
version: 2,
|
|
909
|
+
tasks: [task],
|
|
910
|
+
frontendTestLayout: parentSpec?.frontendTestLayout,
|
|
911
|
+
};
|
|
890
912
|
validateTaskWritePolicy(task, spec, issues);
|
|
891
913
|
validateShellTaskConfig(task, spec, issues);
|
|
892
914
|
validateStaticTaskConfig(task, issues);
|
|
@@ -894,7 +916,7 @@ export function assertValidMaterializedDagTask(task) {
|
|
|
894
916
|
validateRetryPolicyTaskConfig(task, issues);
|
|
895
917
|
validateOutputProtocolTaskConfig(task, issues);
|
|
896
918
|
validateWriterOutcomePolicyTaskConfig(task, issues);
|
|
897
|
-
validateCommandPolicyTaskConfig(task, issues);
|
|
919
|
+
validateCommandPolicyTaskConfig(task, issues, spec);
|
|
898
920
|
if (issues.length > 0) {
|
|
899
921
|
throw new Error(`invalid materialized dynamic child ${task.id}: ${issues.map((issue) => issue.message).join("; ")}`);
|
|
900
922
|
}
|
|
@@ -950,9 +972,10 @@ export function validateDagSpec(spec) {
|
|
|
950
972
|
validateRetryPolicyTaskConfig(task, issues);
|
|
951
973
|
validateOutputProtocolTaskConfig(task, issues);
|
|
952
974
|
validateWriterOutcomePolicyTaskConfig(task, issues);
|
|
953
|
-
validateCommandPolicyTaskConfig(task, issues);
|
|
954
|
-
validateDynamicChildCommandPolicy(task, issues);
|
|
975
|
+
validateCommandPolicyTaskConfig(task, issues, spec);
|
|
976
|
+
validateDynamicChildCommandPolicy(task, issues, spec);
|
|
955
977
|
validateProjectGovernanceTaskConfig(task, spec, issues);
|
|
978
|
+
validatePiExtensionsTaskConfig(task, issues);
|
|
956
979
|
validateFailureAwareDependsOn(task, spec, issues);
|
|
957
980
|
}
|
|
958
981
|
validateSameRankWriteSetConflicts(spec, ranks, issues);
|
|
@@ -963,6 +986,43 @@ export function validateDagSpec(spec) {
|
|
|
963
986
|
}
|
|
964
987
|
return issues;
|
|
965
988
|
}
|
|
989
|
+
/**
|
|
990
|
+
* Fail-closed `piExtensions` validation (plan 2026-08-21 D1/D2):
|
|
991
|
+
* - only `executor: "pi"` nodes may declare it (shell/static reject);
|
|
992
|
+
* - unknown ids outside the frozen enum are rejected at parse time by zod,
|
|
993
|
+
* and here for task objects that bypass schema parsing;
|
|
994
|
+
* - closeout nodes must stay fully closed (extension-free) — the two-bucket
|
|
995
|
+
* generator never assigns it there, so any appearance is contract drift.
|
|
996
|
+
*/
|
|
997
|
+
function validatePiExtensionsTaskConfig(task, issues) {
|
|
998
|
+
const ids = task.piExtensions;
|
|
999
|
+
if (ids === undefined)
|
|
1000
|
+
return;
|
|
1001
|
+
if (task.executor !== "pi") {
|
|
1002
|
+
issues.push({
|
|
1003
|
+
type: "invalid-pi-extensions-config",
|
|
1004
|
+
message: `task ${task.id} piExtensions requires executor "pi" (found ${task.executor})`,
|
|
1005
|
+
});
|
|
1006
|
+
return;
|
|
1007
|
+
}
|
|
1008
|
+
const allowed = new Set(dagPiExtensionIdSchema.options);
|
|
1009
|
+
for (const id of ids) {
|
|
1010
|
+
if (!allowed.has(id)) {
|
|
1011
|
+
issues.push({
|
|
1012
|
+
type: "invalid-pi-extensions-config",
|
|
1013
|
+
message: `task ${task.id} piExtensions has unknown id "${id}"; allowed: ${[
|
|
1014
|
+
...allowed,
|
|
1015
|
+
].join(", ")}`,
|
|
1016
|
+
});
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
if (task.id === "closeout-pi" && ids.length > 0) {
|
|
1020
|
+
issues.push({
|
|
1021
|
+
type: "invalid-pi-extensions-config",
|
|
1022
|
+
message: "closeout-pi must stay extension-free (read buckets exclude closeout)",
|
|
1023
|
+
});
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
966
1026
|
function validateProjectGovernanceTaskConfig(task, spec, issues) {
|
|
967
1027
|
if (task.governanceStandardReview) {
|
|
968
1028
|
if (task.executor !== "pi" ||
|
package/docs/README.md
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
| 选择快速、标准或完整验证命令 | `governance/verification-matrix.md` |
|
|
28
28
|
| 理解 CLI、runtime 和初始化能力边界 | `runtime/loop-agent-harness.md` |
|
|
29
29
|
| 运行 DAG、查看报告或处理失败 | `runtime/agent-dag-runner.md`、`runtime/agent-dag-recovery-playbook.md`;Operator Chat P0 closeout 见 `reports/feature/2026-08-14-operator-chat-dag-recovery-p0.md` |
|
|
30
|
+
| 理解前端实现 DAG 与需求保真账本 | `runtime/frontend-implementation-workflow.md`(含 source fidelity ledger v2 绑定、顺序 reconciliation、独立 reviewer、human resolution 与 prewrite fail-closed);init-evolution 审查见 `reports/init-evolution/2026-08-24-frontend-source-fidelity-ledger-init-evolution-review.md` |
|
|
30
31
|
| 按 TDD、验证和调试纪律推进修复 | `governance/harness-methodology-tdd.md`、`governance/harness-methodology-verification.md`、`governance/harness-methodology-debugging.md` |
|
|
31
32
|
| 执行真实 backend-test provider 验证 | `runtime/backend-test-live-campaign.md` |
|
|
32
33
|
| 判断单任务 loop-agent Production Readiness | `operations/production-readiness.md` |
|
|
@@ -72,6 +73,7 @@
|
|
|
72
73
|
| `design/active/` | 仍会影响后续决策的设计输入、路线与契约 |
|
|
73
74
|
| `design/visual-references/` | 长期视觉参考,不表达实现状态 |
|
|
74
75
|
| `design/archive/` | 历史设计和已被实现/替代的阶段性设计 |
|
|
76
|
+
| `superpowers/specs/` | Superpowers 工作流产出的阶段性实现设计输入 |
|
|
75
77
|
| `exec-plans/active/` | 仍需推进或明确保持 open 的任务合同 |
|
|
76
78
|
| `exec-plans/completed/` | 已完成任务合同归档 |
|
|
77
79
|
| `progress/` | 仍需下一次会话接手的当前 handoff 入口 |
|
|
@@ -33,6 +33,7 @@ loop-agent CLI
|
|
|
33
33
|
| Worker readiness baseline | Attempt identity、immutable owner、lineage/revision、task-scoped lease、controller protocol、acceptance、reconcile | Agent Worker PR v1 Phase 1–7 / `0.32.0` |
|
|
34
34
|
| Operator Surface | 裸 `agent-worker console`;Operate、`/inspect/`、Operator Chat、recovery CTA、intake bridge | ADR 0005、0011–0013 |
|
|
35
35
|
| 自举与验证 | controller identity、skill snapshot、deterministic/live canary、verified tarball、`verify:tree` receipt | `runtime-boundaries.md`、verification matrix |
|
|
36
|
+
| Source fidelity ledger | 原始 requirement/acceptance 文档保持语义权威,派生 `source/需求.md` 仅作导航视图;确定性 fragment inventory、受管 `requirement-ledger.json`(进入 Task Contract transaction 与 canonical hash)、source binding v2(仅 frontend taskKind,schemaVersion=2 必填字段)、prewrite fail-closed 门禁(`SOURCE_FIDELITY_*`/`source-*` 稳定错误码)、顺序 reconciliation 与独立 reviewer、human resolution 生效、有界提示词与最终 reviewer 核对清单 | `20260824-frontend-source-fidelity-ledger-v1` + `2026-08-24-frontend-source-fidelity-repair-v2`(本页面下方 init-evolution 审查)、`CHANGELOG.md [Unreleased]` |
|
|
36
37
|
|
|
37
38
|
### 当前不变量
|
|
38
39
|
|
|
@@ -106,3 +107,47 @@ Evidence & Trust Plane
|
|
|
106
107
|
2. 证明成立后更新 current capability summary 和本页“当前架构”。
|
|
107
108
|
3. 未证明部分只保留在 active design/exec-plan,不能通过修改措辞升级状态。
|
|
108
109
|
4. 使用者短索引同步到 `website/docs/overview/roadmap.md`,避免复制长版本流水账。
|
|
110
|
+
|
|
111
|
+
## Init Evolution Review — 2026-08-24 frontend source fidelity ledger
|
|
112
|
+
|
|
113
|
+
Base/Head:见 `docs/reports/init-evolution/` 中对应 `*-init-evolution-review.md`(若已提交则含 Base/Head 字段;未提交工作区由 CI 非严格模式放行)。
|
|
114
|
+
|
|
115
|
+
### Changed Surface
|
|
116
|
+
|
|
117
|
+
- `src/task/source-prepare/**`:新增 `fragment-inventory.ts`、`ledger.ts`;扩展 `types.ts`、`prepare.ts`、`completeness.ts`、`parse-intent.ts`(无外部 API 变化)。
|
|
118
|
+
- `src/task/contract/**`:`requirement-ledger.json` 进入受管 transaction 与 canonical hash;`TaskContractSourceHashesV1` 新增可选 `requirementLedgerSha256`(legacy ref 向后兼容)。
|
|
119
|
+
- `src/workflows/dag/**`:`dagSourceBindingSchema` 拆为 v1/v2 discriminated union(v2 schemaVersion=2,四个 ledger 字段全部必填;v1 strict 拒绝 ledger 字段);`init-hybrid` 改读已持久化 ledger(缺失/漂移 fail closed);prewrite 门禁新增 ledger 检查与失败码。
|
|
120
|
+
- `src/task/source-prepare/**`:新增 `ledger-reconciliation.ts`(顺序 reconciliation)、`ledger-review.ts`(独立 reviewer);fragment inventory 表格行切分、跨文档稳定 REQ-SRC ID、V4 显式 AC 标题;human resolution 生效。
|
|
121
|
+
- `src/worker/observe/**`:新增只读 `GET /api/tasks/:id/ledger` 与展示(安全摘要,不泄漏原文)。
|
|
122
|
+
- `src/worker/console/**`:Draft/ContractPanel/InspectSplitPanel 安全摘要展示。
|
|
123
|
+
- `docs/templates/frontend-implementation-contract.schema.json`:requirements 增加可选 `sourceFragmentIds`/`sourceRefs`,sourceBinding 增加可选 ledger 字段(all-or-none)。
|
|
124
|
+
|
|
125
|
+
### Decision
|
|
126
|
+
|
|
127
|
+
**No init impact / Surface check only**。
|
|
128
|
+
|
|
129
|
+
Rationale:
|
|
130
|
+
|
|
131
|
+
- 新增均为模块内部实现;不新增 CLI 命令、不改 init 入口、不改变 target-project 初始化行为。
|
|
132
|
+
- `docs/templates/frontend-implementation-contract.schema.json` 已随 `docs/templates/` 目录 glob 打包(`package.json files`),无需新增 manifest 条目。
|
|
133
|
+
- 运行时加载 schema 的 `loadFrontendImplementationContractJsonSchema` 仅做结构性校验($id/required/properties/const),新增可选字段不破坏既有契约。
|
|
134
|
+
- 不新增任何运行时或开发依赖(node:crypto、既有 zod/Vitest/Vite/React 19)。
|
|
135
|
+
|
|
136
|
+
### Updates Made
|
|
137
|
+
|
|
138
|
+
- `docs/architecture/evolution.md`:本条目。
|
|
139
|
+
- `CHANGELOG.md [Unreleased]`、`CONTEXT.md`:glossary 术语。
|
|
140
|
+
- `docs/templates/frontend-implementation-contract.schema.json`:可选字段同步。
|
|
141
|
+
|
|
142
|
+
### Verification
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
npm run typecheck && npm run console:typecheck
|
|
146
|
+
npx vitest run test/task-source-prepare.test.ts test/task-contract-canonicalize.test.ts test/task-contract-observe.test.ts test/dag-init-hybrid.test.ts test/frontend-implementation-contract.test.ts test/frontend-prewrite-gate.test.ts test/frontend-writer-admission.test.ts test/worker/observe/dag-inspector-node-input.test.ts test/worker/console/inspect-split-panel.test.ts
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Residual Risk
|
|
150
|
+
|
|
151
|
+
- 长尾 24K 截断遗漏回归:以确定性分片 inventory + ledger 覆盖统计断言固定(AC-FIDELITY-001/007)。
|
|
152
|
+
- 账本漂移/篡改:inputDigest 复用失效 + prewrite fail closed(AC-FIDELITY-003/006)。
|
|
153
|
+
- 既有带引用 frontend task 重建路径变化:ledger 纳入 canonical hash 改变 `observeTaskContractState` 判定,legacy ref 向后兼容覆盖(AC-FIDELITY-004)。
|
|
@@ -30,9 +30,11 @@
|
|
|
30
30
|
"docs/templates/frontend-task-requirement.md",
|
|
31
31
|
"docs/templates/frontend-task-constraints.md",
|
|
32
32
|
"docs/templates/frontend-design-contract.md",
|
|
33
|
+
"docs/templates/frontend-implementation-contract.schema.json",
|
|
33
34
|
"docs/templates/worker-dogfood-setup.md",
|
|
34
35
|
"docs/templates/worker-dogfood-evidence.md",
|
|
35
36
|
"docs/templates/harness.schema.json",
|
|
37
|
+
"docs/templates/spec-registry.schema.json",
|
|
36
38
|
"docs/templates/interactive-ui-round2-experiment.md",
|
|
37
39
|
"docs/templates/product-line/README.md",
|
|
38
40
|
"docs/templates/product-line/AGENTS.md",
|
|
@@ -50,6 +52,9 @@
|
|
|
50
52
|
"scripts/kb-graph-materialize.mjs",
|
|
51
53
|
"scripts/kb-graph-promote.mjs",
|
|
52
54
|
"scripts/kb-graph-incremental-prepare.mjs",
|
|
55
|
+
"scripts/next-info.mjs",
|
|
56
|
+
"scripts/next-publish-gate.mjs",
|
|
57
|
+
"scripts/release-source-binding.mjs",
|
|
53
58
|
"docs/templates/agent-dag.schema.json",
|
|
54
59
|
"examples/example-dag.json",
|
|
55
60
|
"skills/agent-worker/SKILL.md",
|
|
@@ -99,6 +104,7 @@
|
|
|
99
104
|
"docs/feature-workflow.md",
|
|
100
105
|
"docs/verification-matrix.md",
|
|
101
106
|
"docs/loop-agent-harness.md",
|
|
107
|
+
"docs/spec-registry.json",
|
|
102
108
|
"docs/harness-methodology-tdd.md",
|
|
103
109
|
"docs/harness-methodology-verification.md",
|
|
104
110
|
"docs/harness-methodology-debugging.md",
|
|
@@ -174,6 +180,7 @@
|
|
|
174
180
|
".pi/settings.json"
|
|
175
181
|
],
|
|
176
182
|
"initSurface": {
|
|
183
|
+
"docs/spec-registry.json": "generated",
|
|
177
184
|
"README.md": "managed-block",
|
|
178
185
|
"AGENTS.md": "managed-block",
|
|
179
186
|
".gitignore": "managed-block",
|
|
@@ -277,6 +284,7 @@
|
|
|
277
284
|
"harness.json",
|
|
278
285
|
"package.json",
|
|
279
286
|
"src/commands/init.ts",
|
|
287
|
+
"src/commands/init-model-catalog.ts",
|
|
280
288
|
"src/commands/client-recovery.ts",
|
|
281
289
|
"src/commands/init-upgrade.ts",
|
|
282
290
|
"src/cli.ts",
|
|
@@ -302,6 +310,7 @@
|
|
|
302
310
|
"description": "Changes that may alter target-project initialization behavior, default DAG role skills, skill resolution, or package/init contracts.",
|
|
303
311
|
"patterns": [
|
|
304
312
|
"src/commands/init.ts",
|
|
313
|
+
"src/commands/init-model-catalog.ts",
|
|
305
314
|
"src/commands/client-recovery.ts",
|
|
306
315
|
"src/commands/init-upgrade.ts",
|
|
307
316
|
"src/cli.ts",
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
- [`local-development-environment.md`](local-development-environment.md):本地环境、Windows 差异和常见排障。
|
|
8
8
|
- [`branch-merge-guideline.md`](branch-merge-guideline.md):按风险选择合并模式并留下 source-SHA 证据。
|
|
9
9
|
- [`github-collaboration.md`](github-collaboration.md):仓库内 GitHub 协作约定及发布通道。
|
|
10
|
-
- [`version-and-release-management.md`](version-and-release-management.md):版本发布管理——next / release-x.y / latest
|
|
10
|
+
- [`version-and-release-management.md`](version-and-release-management.md):版本发布管理——next / release-x.y / latest 渠道、移动式 `npm-next` ref、`inspect next` 查询入口、workflow 与 promote 手册。
|
|
11
11
|
- [`production-readiness.md`](production-readiness.md):交付前的生产就绪判断。
|
|
12
12
|
- [`agent-worker-production-readiness.md`](agent-worker-production-readiness.md):agent-worker Feature/Task Pool 外层编排的 Production Readiness v1 操作合同。
|
|
13
13
|
- [`backend-test-jacoco-coverage.md`](backend-test-jacoco-coverage.md):Java 被测服务挂载 JaCoCo tcpserver agent 的 Maven、`java -jar` 与 Docker 操作手册。
|
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
本文记录仅与特定开发环境有关、但可能反复影响验证结果的问题。它不是通用工程规则;标准验证命令仍以 [`verification-matrix.md`](../governance/verification-matrix.md) 为准。
|
|
4
4
|
|
|
5
|
+
## Operator Console 前端快速迭代
|
|
6
|
+
|
|
7
|
+
对 `src/worker/console/static-src/` 内的对话样式和前端交互做高频调整时,使用固定 8790 的开发入口:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm run console:dev
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
它从当前源码启动真实 Console 后端,并在内部 `8791` 常驻 Vite dev server。浏览器始终访问 `http://127.0.0.1:8790/`:API、HttpOnly Cookie、确认令牌和 Origin 校验仍由真实 Console 处理,前端 HTML/模块请求才由 8790 转发给 Vite。CSS 保存后原地热替换,TSX 保存后自动整页刷新;不生成 `static-dev` bundle,也不重复运行生产 build。
|
|
14
|
+
|
|
15
|
+
常用参数:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm run console:dev -- --no-open
|
|
19
|
+
npm run console:dev -- --port 8792 --reload-port 8793 --no-open
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
默认端口是 Console `8790`、内部 Vite/HMR `8791`;两者都只允许 loopback。端口已占用时命令会失败并报告端口,不会停止或接管已有进程。前端类型检查在后台持续输出诊断,但不阻塞 HMR;后端源码变化时只重启 Console 子进程,Vite 保持常驻。
|
|
23
|
+
|
|
24
|
+
该命令只优化编辑反馈,不构成验收。独立交互修复完成后仍需运行定向 Vitest;交付前按验证矩阵运行 typecheck、正式 `npm run console:build` / `npm run build`。正式构建继续写入 `dist/worker/console/static/`,不会包含 `/@vite/client`、8791 或开发代理代码。
|
|
25
|
+
|
|
5
26
|
## Git hooks(本仓库)
|
|
6
27
|
|
|
7
28
|
每个 clone 安装一次:
|
package/docs/templates/README.md
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
## Frontend
|
|
38
38
|
|
|
39
39
|
- `frontend-task-requirement.md`、`frontend-task-constraints.md`、`frontend-design-contract.md` — 前端任务输入与设计合同。
|
|
40
|
-
- `frontend-implementation-contract.schema.json` — 前端实现合同 schema
|
|
40
|
+
- `frontend-implementation-contract.schema.json` — 前端实现合同 schema(sourceBinding v2 ledger 字段 all-or-none:任一出现则四项齐全,禁止 v1+optional 冒充 v2)。`requirements[].sourceRefs[].items` 使用合法 `$ref: #/$defs/path`(相对路径、无 `..` 逃逸、无反斜杠),模板 JSON 无非法键,运行时加载器可直接编译(AC-003)。
|
|
41
41
|
- `frontend-test-dag.json` — frontend-test DAG 模板;其 deterministic checklist 会拒绝 alternative executable instructions,仅允许 allowlisted `playwright-cli` command。Pi generator/reviser 的 runtime writeSet 仅授权下列目标项目生成路径(不是本仓库文档索引目标):
|
|
42
42
|
|
|
43
43
|
~~~text
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
- `knowledge-sync-dag.json`、`knowledge-graph-bootstrap-dag.json` — 知识同步与图谱初始化 DAG。
|
|
57
57
|
- `knowledge-sync-draft.schema.json` — 知识同步草稿 schema。
|
|
58
58
|
- `harness.schema.json` — `harness.json` 的 IDE JSON Schema。
|
|
59
|
+
- `spec-registry.schema.json` — 项目级 `ai_workspace/loop-agent/spec-registry.json` 的机器校验 schema。
|
|
59
60
|
|
|
60
61
|
## 子目录
|
|
61
62
|
|
|
@@ -176,7 +176,8 @@
|
|
|
176
176
|
"humanEscalationJson",
|
|
177
177
|
"humanEscalationMd",
|
|
178
178
|
"humanApproval",
|
|
179
|
-
"humanRejection"
|
|
179
|
+
"humanRejection",
|
|
180
|
+
"changeManifest"
|
|
180
181
|
],
|
|
181
182
|
"properties": {
|
|
182
183
|
"resultSummary": { "$ref": "#/$defs/dagArtifactRef" },
|
|
@@ -188,7 +189,12 @@
|
|
|
188
189
|
"humanEscalationJson": { "$ref": "#/$defs/dagArtifactRef" },
|
|
189
190
|
"humanEscalationMd": { "$ref": "#/$defs/dagArtifactRef" },
|
|
190
191
|
"humanApproval": { "$ref": "#/$defs/dagArtifactRef" },
|
|
191
|
-
"humanRejection": { "$ref": "#/$defs/dagArtifactRef" }
|
|
192
|
+
"humanRejection": { "$ref": "#/$defs/dagArtifactRef" },
|
|
193
|
+
"changeManifest": { "$ref": "#/$defs/dagArtifactRef" },
|
|
194
|
+
"changeManifestChangedFiles": {
|
|
195
|
+
"type": "array",
|
|
196
|
+
"items": { "type": "string" }
|
|
197
|
+
}
|
|
192
198
|
}
|
|
193
199
|
},
|
|
194
200
|
"repairArtifact": {
|
|
@@ -130,6 +130,18 @@
|
|
|
130
130
|
"toolProfile": {
|
|
131
131
|
"enum": ["read-only", "write"]
|
|
132
132
|
},
|
|
133
|
+
"piExtensionId": {
|
|
134
|
+
"type": "string",
|
|
135
|
+
"enum": ["pi-codegraph", "pi-lens"],
|
|
136
|
+
"description": "Frozen Pi extension short id resolved at run time against the Pi settings package inventory. Adding a package requires changing the plan and this enum."
|
|
137
|
+
},
|
|
138
|
+
"piExtensions": {
|
|
139
|
+
"type": "array",
|
|
140
|
+
"minItems": 1,
|
|
141
|
+
"uniqueItems": true,
|
|
142
|
+
"items": { "$ref": "#/$defs/piExtensionId" },
|
|
143
|
+
"description": "Node-level explicit Pi extension allowlist (backend implementation DAGs only). Omitted = extension discovery stays fully closed (R8.1). Only executor 'pi' nodes may declare it."
|
|
144
|
+
},
|
|
133
145
|
"role": {
|
|
134
146
|
"enum": ["planner", "scout", "implementer", "reviewer", "supervisor", "verifier", "closeout"]
|
|
135
147
|
},
|
|
@@ -356,6 +368,31 @@
|
|
|
356
368
|
"properties": { "schemaVersion": { "const": 1 }, "requireBaseline": { "const": true } }
|
|
357
369
|
},
|
|
358
370
|
"frontendTestCaseChecklist": { "type": "object", "additionalProperties": false },
|
|
371
|
+
"frontendBrowserToolPreflight": { "type": "object", "additionalProperties": false },
|
|
372
|
+
"frontendTestStandardScenarios": { "type": "object", "additionalProperties": false },
|
|
373
|
+
"frontendTestEnvironmentProbe": { "type": "object", "additionalProperties": false },
|
|
374
|
+
"frontendTestCaseManifest": {
|
|
375
|
+
"type": "object",
|
|
376
|
+
"additionalProperties": false,
|
|
377
|
+
"properties": {
|
|
378
|
+
"maxCases": { "type": "integer", "minimum": 1 },
|
|
379
|
+
"declaredAcIds": { "type": "array", "items": { "type": "string" } }
|
|
380
|
+
}
|
|
381
|
+
},
|
|
382
|
+
"frontendTestResultFinalize": {
|
|
383
|
+
"type": "object",
|
|
384
|
+
"additionalProperties": false,
|
|
385
|
+
"properties": {
|
|
386
|
+
"declaredAcIds": { "type": "array", "items": { "type": "string" } }
|
|
387
|
+
}
|
|
388
|
+
},
|
|
389
|
+
"frontendTestReports": {
|
|
390
|
+
"type": "object",
|
|
391
|
+
"additionalProperties": false,
|
|
392
|
+
"properties": {
|
|
393
|
+
"l5": { "type": "boolean" }
|
|
394
|
+
}
|
|
395
|
+
},
|
|
359
396
|
"frontendTestEvidenceValidation": { "type": "object", "additionalProperties": false },
|
|
360
397
|
"frontendTestHtmlReport": { "type": "object", "additionalProperties": false },
|
|
361
398
|
"backendTestPipeline": {
|
|
@@ -383,6 +420,12 @@
|
|
|
383
420
|
{ "required": ["frontendVerificationBundle"] },
|
|
384
421
|
{ "required": ["frontendReviewContext"] },
|
|
385
422
|
{ "required": ["frontendTestCaseChecklist"] },
|
|
423
|
+
{ "required": ["frontendBrowserToolPreflight"] },
|
|
424
|
+
{ "required": ["frontendTestStandardScenarios"] },
|
|
425
|
+
{ "required": ["frontendTestEnvironmentProbe"] },
|
|
426
|
+
{ "required": ["frontendTestCaseManifest"] },
|
|
427
|
+
{ "required": ["frontendTestResultFinalize"] },
|
|
428
|
+
{ "required": ["frontendTestReports"] },
|
|
386
429
|
{ "required": ["frontendTestEvidenceValidation"] },
|
|
387
430
|
{ "required": ["frontendTestHtmlReport"] },
|
|
388
431
|
{ "required": ["backendTestPipeline"] }
|
|
@@ -423,7 +466,7 @@
|
|
|
423
466
|
"retryCategories": {
|
|
424
467
|
"type": "array",
|
|
425
468
|
"items": {
|
|
426
|
-
"enum": ["timeout", "network", "rate-limit", "unavailable", "empty-output", "output-too-large", "protocol-invalid", "invalid-output", "writer-empty-diff", "incomplete-write-set", "writer-clean-timeout"]
|
|
469
|
+
"enum": ["timeout", "network", "rate-limit", "unavailable", "empty-output", "output-too-large", "protocol-invalid", "invalid-output", "writer-empty-diff", "incomplete-write-set", "writer-clean-timeout", "read-burst", "context-overflow"]
|
|
427
470
|
},
|
|
428
471
|
"default": ["timeout", "network", "rate-limit", "unavailable", "empty-output"],
|
|
429
472
|
"description": "Failure categories eligible for retry. quota/auth/write-guard are never eligible. invalid-output is allowed only on explicit structured/protocol policies; writer-empty-diff and incomplete-write-set are reserved for requireChangedFiles generation/completeness writers; writer-clean-timeout is reserved for standard bounded writers after explicit zero-write-tool-call and empty-diff evidence."
|
|
@@ -485,6 +528,7 @@
|
|
|
485
528
|
"items": { "type": "string", "minLength": 1 }
|
|
486
529
|
},
|
|
487
530
|
"toolProfile": { "$ref": "#/$defs/toolProfile" },
|
|
531
|
+
"piExtensions": { "$ref": "#/$defs/piExtensions" },
|
|
488
532
|
"governanceStandardReview": {
|
|
489
533
|
"type": "boolean",
|
|
490
534
|
"description": "Explicitly opts this node into writer-change-scoped AGENTS.md and repository-local code-standard review. Never inferred from node id or role."
|