@tea-agent/loop-agent 0.39.3 → 0.40.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +135 -92
- package/dist/adapters/context-transfer/optional-pi-handoff.js +31 -0
- package/dist/adapters/context-transfer/pi-session.js +61 -0
- package/dist/build-stamp.json +3 -3
- package/dist/cli/command-definitions.js +12 -0
- package/dist/cli/program.js +23 -1
- package/dist/commands/dag-artifact.js +284 -0
- package/dist/commands/dag-context.js +184 -0
- package/dist/commands/dag-rerun.js +206 -1
- package/dist/executors/dag-pi-executor.js +108 -19
- package/dist/executors/pi-executor.js +4 -2
- package/dist/executors/pi-sdk-executor.js +49 -1
- package/dist/executors/pi-writer-tool-policy.js +57 -1
- package/dist/executors/shell-executor.js +42 -2
- package/dist/executors/workspace-write-snapshot.js +68 -0
- package/dist/{worker → infrastructure}/console/app-data.js +4 -0
- package/dist/infrastructure/console/artifact-revision-store.js +430 -0
- package/dist/infrastructure/console/context-export-store.js +160 -0
- package/dist/infrastructure/console/dir-lock.js +132 -0
- package/dist/infrastructure/harness/artifact-store.js +10 -1
- package/dist/infrastructure/harness/atomic-write.js +35 -2
- package/dist/shared/context-transfer/artifact-revision.js +172 -0
- package/dist/shared/context-transfer.js +418 -0
- package/dist/shared/operator/capabilities.js +14 -0
- package/dist/shared/operator/safe-run-summary.js +1 -0
- package/dist/shared/path-safety.js +93 -0
- package/dist/shared/preview.js +28 -4
- package/dist/task/config-types.js +12 -1
- package/dist/task/source-prepare/fragment-inventory.js +1 -14
- package/dist/task/task-demand-routing.js +3 -0
- package/dist/worker/console/chat/chat-event-store.js +77 -7
- 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/pi-runtime.js +331 -18
- package/dist/worker/console/chat/provider-error.js +98 -0
- package/dist/worker/console/chat/resource-preferences-store.js +1 -1
- package/dist/worker/console/chat/routes.js +389 -56
- package/dist/worker/console/chat/session-stats.js +179 -0
- package/dist/worker/console/chat/session-store.js +94 -64
- 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 +79 -0
- package/dist/worker/console/console-update-runtime.js +1 -1
- package/dist/worker/console/context-transfer-diagnostics.js +198 -0
- package/dist/worker/console/dag-confirmation.js +1 -1
- package/dist/worker/console/dag-execution-receipt.js +1 -1
- package/dist/worker/console/doctor.js +1 -1
- package/dist/worker/console/draft-store.js +1 -1
- package/dist/worker/console/human-gate-token.js +1 -1
- package/dist/worker/console/index.js +3 -3
- package/dist/worker/console/interview/assessment.js +1 -1
- package/dist/worker/console/interview/session.js +1 -1
- package/dist/worker/console/native-directory-picker.js +13 -0
- package/dist/worker/console/operation-runner.js +45 -4
- package/dist/worker/console/operation-sse.js +1 -1
- package/dist/worker/console/operation-wait.js +1 -1
- package/dist/worker/console/operator-actions.js +104 -3
- package/dist/worker/console/operator-surface-health.js +1 -1
- package/dist/worker/console/operator-user-error.js +128 -0
- package/dist/worker/console/routes.js +927 -8
- package/dist/worker/console/security.js +39 -4
- package/dist/worker/console/server.js +532 -187
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-CTx1TrNa.js → abnfDiagram-N423BO3Z-CpWvwARc.js} +1 -1
- package/dist/worker/console/static/assets/{arc-B4i9cVxX.js → arc-DctXgO-g.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-BAXE8_Rl.js → architectureDiagram-T3A2C74G-D4mIkoQl.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-C5Xh59at.js → blockDiagram-VBNYF7ZC-ClG0--KO.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-B_asOzAu.js → c4Diagram-5PPSVZJV-CwdLk78T.js} +1 -1
- package/dist/worker/console/static/assets/channel-C9VQZ-ru.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-wRO_iRNc.js → chunk-2GRJ4B5K-DKczcu-O.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-ByOaSh_G.js → chunk-2Q5K7J3B-BV6F-vBI.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-DjLzudan.js → chunk-5RXB4S5H-DtojVnvA.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-JCNGkXYT.js → chunk-5VM5RSS4-BjDQRGnO.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-BhrPXXMZ.js → chunk-6Q2QTUOP-I0fV6ngU.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-TJ5JuEBT.js → chunk-GF5L2VYU-BM8C-mmC.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-VVthn_mD.js → chunk-JWPE2WC7-BEK-a15e.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-D60-Mny4.js → chunk-KBJHAD2P-CQsg_fSR.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-zXv7aVye.js → chunk-RYQCIY6F-B-BcaUm3.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-By9VQoi1.js → chunk-XXDRQBXY-D1Bu08fg.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BsCkw5MF.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BsCkw5MF.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-C4zQLe-M.js → cose-bilkent-JH36ORCC-q8nwtxBR.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-wh5N2ReN.js → cynefin-VYW2F7L2-CruhpURw.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-Dlu5wIqs.js → cynefinDiagram-MW4NZA55-CJne6iYF.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-CrDgthc6.js → dagre-VZM6K2ZE-CbeLvBU5.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-zN1clg27.js → diagram-7IWD3JNH-DmCxH1Pe.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-BN-o7J7-.js → diagram-B4RE2ZJO-DJ5OYhtC.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-C8SuPt0d.js → diagram-LBJQPF4R-B-UN-hln.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-BoizuHbZ.js → diagram-Q27KOJAE-CcEro8Ey.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-BzUzXixG.js → diagram-UB23O5K3-BBBzDden.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-Ev3lA4Cf.js → ebnfDiagram-BXEA7PRR-xKEyH-oo.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-GALUzRbs.js → erDiagram-JOGREHBK-C7xl63VC.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-CZJN65Sb.js → flowDiagram-UKHOOZJN-nthQQ9nR.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-JLB9OESl.js → ganttDiagram-PKOTCBZU-CWN5mE33.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-CcvCr4GD.js → gitGraphDiagram-DS77QQ5N-Wn86tQ6N.js} +1 -1
- package/dist/worker/console/static/assets/index-D-0NVyMk.css +1 -0
- package/dist/worker/console/static/assets/index-gwyOxQiS.js +407 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-HG5z7aVg.js → infoDiagram-6WML65LV-_WQymGtW.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-BHEu9chR.js → ishikawaDiagram-WSZJBQD7-COBeivBm.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-Cp_Up8-a.js → journeyDiagram-NVQOT4AX-CwGOJl3Q.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-DvVeY-em.js → kanban-definition-27J2QSJJ-Ci0CJ5Vi.js} +1 -1
- package/dist/worker/console/static/assets/{linear-aGmcjgTn.js → linear-CPjMq6vN.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-Biyo-tqA.js → mermaid.core-Z0wGoe0b.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-DyxY2pIb.js → mindmap-definition-FAOFIHXS-dISked0d.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-CkdGuc50.js → pegDiagram-VL7TDLO6-BJxgof7Y.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-NNQI9xVR.js → pieDiagram-7S7Q4E2Y-CIblU8eW.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-PAJkuz_G.js → quadrantDiagram-CIZ2JOQS-vwYiqh8E.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-ZwrQod0O.js → railroadDiagram-AXF67PYL-_iOsVeFm.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-D3ZfrzM2.js → requirementDiagram-LRYGKXZP-Dk0MLxO_.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-DDGFmWk5.js → sankeyDiagram-W5VNT64P-Dx7HtLVW.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DO6mmXTA.js → sequenceDiagram-SI44F4Z6-DRuWjlpL.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-DMbCQiJt.js → sizeCapture-X5ZJPWSS-Bhy9DQAA.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-Di_YUEfC.js → stateDiagram-OKZ733FA-DAx9twnU.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-Dmdf8cGy.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-Bn2PphNJ.js → swimlanes-SLNWSIFB-okMlvVrM.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-W1IcAFff.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-DPh8pRsp.js → timeline-definition-Z64GVDOM-DXqCKe37.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-GMfl26pW.js → vennDiagram-T6HMQDX7-CeIUkwBh.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-DTlmVrmF.js → wardleyDiagram-T6FBY63Y-BP76BKTN.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-YGBjKAS5.js → xychartDiagram-ELKLHX3M-BpVI0OpF.js} +1 -1
- package/dist/worker/console/static/index.html +7 -2
- package/dist/worker/console/static-src/app/console-types.js +29 -4
- package/dist/worker/console/static-src/app/useConsoleShell.js +30 -12
- package/dist/worker/console/static-src/app/useOperatorActions.js +36 -6
- package/dist/worker/console/static-src/app/useRecoveryConsole.js +10 -11
- package/dist/worker/console/static-src/app/useRunProgress.js +2 -1
- package/dist/worker/console/static-src/app/useTaskWizard.js +2 -2
- package/dist/worker/console/static-src/night/useNightBoard.js +8 -5
- package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +141 -8
- package/dist/worker/console/static-src/operator-chat/compaction-message.js +79 -0
- package/dist/worker/console/static-src/operator-chat/details-dag-actions.js +122 -0
- 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/spatial-overlay.js +1 -2
- package/dist/worker/console/static-src/operator-chat/turn-stream-controller.js +25 -0
- package/dist/worker/console/static-src/operator-chat/turn-submission.js +3 -2
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +181 -87
- package/dist/worker/console/static-src/operator-chat/useChatStream.js +159 -44
- package/dist/worker/console/static-src/operator-chat/useChatThread.js +177 -8
- 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/shell/useWorkspaces.js +299 -0
- package/dist/worker/console/static-src/shell/workspace-route.js +339 -0
- package/dist/worker/console/workspace-context.js +260 -0
- package/dist/worker/console/workspace-registry.js +214 -0
- package/dist/worker/continuation/worker-continuation.js +278 -0
- package/dist/worker/observe/health.js +1 -1
- package/dist/worker/observe/node-transparency.js +572 -0
- package/dist/worker/observe/routes.js +51 -1
- package/dist/worker/observe/server.js +4 -0
- package/dist/worker/observe/static/api.js +94 -10
- package/dist/worker/observe/static/app.js +18 -70
- package/dist/worker/observe/static/dag-context-reason-labels.d.ts +9 -0
- package/dist/worker/observe/static/dag-context-reason-labels.js +120 -0
- package/dist/worker/observe/static/index.html +1 -1
- package/dist/worker/observe/static/inspect-workspace.js +307 -0
- 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 -100
- 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 +175 -1
- package/dist/worker/observe/static/styles.css +1039 -128
- package/dist/worker/observe/static/views/dag-inspector.js +1218 -60
- package/dist/worker/observe/static/views/dag.js +2 -1
- package/dist/worker/observe/static/views/dashboard.js +6 -4
- 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 +75 -10
- package/dist/worker/observe/static/views/task.js +1 -1
- package/dist/worker/outcomes/adapters.js +19 -0
- package/dist/worker/outcomes/types.js +1 -0
- package/dist/worker/pool/attempt-lease.js +97 -66
- package/dist/worker/pool/begin-attempt-with-lease.js +1 -0
- package/dist/worker/pool/reconcile.js +46 -1
- package/dist/worker/pool/run-store.js +2 -0
- package/dist/worker/pool/state-projection.js +2 -0
- package/dist/worker/task-spec/workflow-routing.js +8 -3
- package/dist/workflows/dag/artifact-bindings.js +149 -0
- package/dist/workflows/dag/artifact-revision-schema-registry.js +31 -0
- package/dist/workflows/dag/backend-test-pytest-collection.js +11 -10
- package/dist/workflows/dag/backend-test-writer-completeness.js +7 -12
- package/dist/workflows/dag/context-receipt.js +305 -0
- package/dist/workflows/dag/context-transfer/context-bundle.js +423 -0
- package/dist/workflows/dag/context-transfer/operator-actions.js +61 -0
- package/dist/workflows/dag/context-transfer/renderers.js +93 -0
- package/dist/workflows/dag/dynamic-runtime/map.js +1 -0
- package/dist/workflows/dag/frontend-implementation-contract.js +1 -89
- package/dist/workflows/dag/init-hybrid.js +259 -47
- package/dist/workflows/dag/interrupt-request.js +3 -3
- package/dist/workflows/dag/lifecycle.js +3 -3
- package/dist/workflows/dag/node-execution.js +112 -27
- package/dist/workflows/dag/path-safety.js +1 -0
- package/dist/workflows/dag/prompt.js +29 -4
- package/dist/workflows/dag/rerun-plan.js +272 -0
- package/dist/workflows/dag/rerun-run.js +390 -12
- package/dist/workflows/dag/skill-snapshot.js +1 -0
- package/dist/workflows/dag/types.js +203 -8
- package/docs/README.md +1 -0
- package/docs/architecture/runtime-boundaries.md +6 -6
- package/docs/architecture/worker-and-feature.md +1 -1
- package/docs/operations/local-development-environment.md +21 -0
- package/docs/templates/agent-dag.schema.json +50 -0
- package/docs/templates/backend-test-dag.json +265 -237
- package/docs/templates/product-line/task.yaml +1 -1
- package/harness.json +3 -3
- package/package.json +5 -1
- package/skills/loop-agent/references/command-reference.md +6 -0
- package/dist/worker/console/static/assets/channel-Dj_4Moei.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-C0YYAyCa.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-C0YYAyCa.js +0 -1
- package/dist/worker/console/static/assets/index-CW88Fjbw.js +0 -406
- package/dist/worker/console/static/assets/index-DP0ZJl39.css +0 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DrdDvela.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-DPkEAULl.js +0 -8
- package/dist/worker/console/static-src/operator-chat/activity-rail-presentation.js +0 -73
- package/dist/worker/console/static-src/operator-chat/useActivityRailTransition.js +0 -59
- /package/dist/{worker → infrastructure}/console/operation-store.js +0 -0
- /package/dist/{worker → infrastructure}/console/repo-fingerprint.js +0 -0
|
@@ -80,7 +80,10 @@ export const dagShellVerifyEvidenceSchema = z.object({
|
|
|
80
80
|
selectionReasons: z.array(z.string()).default([]),
|
|
81
81
|
/** Non-executing generation-time cwd/local-script validation evidence. */
|
|
82
82
|
preflight: z
|
|
83
|
-
.array(z.object({
|
|
83
|
+
.array(z.object({
|
|
84
|
+
label: z.string(),
|
|
85
|
+
status: z.enum(["ok", "future-delivery-script"]),
|
|
86
|
+
}))
|
|
84
87
|
.default([]),
|
|
85
88
|
/** Effective timeout applied independently to each shell command. */
|
|
86
89
|
commandTimeoutMs: z.number().int().positive().optional(),
|
|
@@ -382,7 +385,7 @@ export const dagWritePolicySchema = z.enum([
|
|
|
382
385
|
"none",
|
|
383
386
|
]);
|
|
384
387
|
/** Git/post-diff write guard intensity for exclusive Pi writers. */
|
|
385
|
-
export const dagWriteGuardPolicySchema = z.enum(["full", "tools-only"]);
|
|
388
|
+
export const dagWriteGuardPolicySchema = z.enum(["full", "tools-only", "filesystem-only"]);
|
|
386
389
|
/**
|
|
387
390
|
* Fail-closed outcome/diff consistency contract for bounded Pi writers.
|
|
388
391
|
* The writer must begin with IMPLEMENTATION_OUTCOME: changed,
|
|
@@ -589,6 +592,8 @@ export const dagDynamicExpansionChildTaskSchema = z.object({
|
|
|
589
592
|
allowedPaths: z.array(z.string()).optional().default([]),
|
|
590
593
|
forbiddenPaths: z.array(z.string()).optional().default([]),
|
|
591
594
|
writeSet: z.array(z.string()).optional(),
|
|
595
|
+
/** Template-rendered strict repository-relative read allowlist. */
|
|
596
|
+
readSet: z.array(z.string()).optional(),
|
|
592
597
|
/**
|
|
593
598
|
* Materialized-child pass-through fields for bounded Pi writer children
|
|
594
599
|
* (backend-test md/pytest case sharding). All optional so legacy
|
|
@@ -732,7 +737,58 @@ export const structuredContractOutputSchemaIds = [
|
|
|
732
737
|
"frontend-implementation-contract-plan-patch-v1",
|
|
733
738
|
"frontend-implementation-contract-revision-patch-v1",
|
|
734
739
|
];
|
|
735
|
-
export const
|
|
740
|
+
export const dagArtifactIdentitySchema = z
|
|
741
|
+
.string()
|
|
742
|
+
.regex(/^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)*$/, "artifact id must be stable lower-case dot/kebab syntax");
|
|
743
|
+
const dagArtifactRelativePathSchema = z
|
|
744
|
+
.string()
|
|
745
|
+
.min(1)
|
|
746
|
+
.refine((value) => !value.includes("\0"), "artifact path must not contain NUL")
|
|
747
|
+
.refine((value) => !value.includes("\\"), "artifact path must use POSIX separators")
|
|
748
|
+
.refine((value) => !value.startsWith("/") && !/^[A-Za-z]:/.test(value), "artifact path must be run-relative")
|
|
749
|
+
.refine((value) => value.split("/").every((segment) => segment !== "" && segment !== ".."), "artifact path must not escape the run");
|
|
750
|
+
export const dagProducedArtifactSchema = z
|
|
751
|
+
.object({
|
|
752
|
+
artifactId: dagArtifactIdentitySchema,
|
|
753
|
+
kind: z.enum(["structured", "assistant", "stdout"]),
|
|
754
|
+
path: dagArtifactRelativePathSchema,
|
|
755
|
+
mediaType: z.string().min(1),
|
|
756
|
+
schemaId: z.string().min(1).optional(),
|
|
757
|
+
revisionPolicy: z.enum(["immutable", "replace-file"]),
|
|
758
|
+
})
|
|
759
|
+
.strict()
|
|
760
|
+
.superRefine((value, ctx) => {
|
|
761
|
+
if (value.kind === "structured" && !value.schemaId) {
|
|
762
|
+
ctx.addIssue({
|
|
763
|
+
code: z.ZodIssueCode.custom,
|
|
764
|
+
path: ["schemaId"],
|
|
765
|
+
message: "structured artifact requires schemaId",
|
|
766
|
+
});
|
|
767
|
+
}
|
|
768
|
+
if (value.kind !== "structured" && value.schemaId) {
|
|
769
|
+
ctx.addIssue({
|
|
770
|
+
code: z.ZodIssueCode.custom,
|
|
771
|
+
path: ["schemaId"],
|
|
772
|
+
message: "only structured artifacts may declare schemaId",
|
|
773
|
+
});
|
|
774
|
+
}
|
|
775
|
+
if (value.revisionPolicy === "replace-file" &&
|
|
776
|
+
value.kind !== "structured") {
|
|
777
|
+
ctx.addIssue({
|
|
778
|
+
code: z.ZodIssueCode.custom,
|
|
779
|
+
path: ["revisionPolicy"],
|
|
780
|
+
message: "MVP revisions are limited to structured artifacts",
|
|
781
|
+
});
|
|
782
|
+
}
|
|
783
|
+
});
|
|
784
|
+
export const dagConsumedArtifactSchema = z
|
|
785
|
+
.object({
|
|
786
|
+
artifactId: dagArtifactIdentitySchema,
|
|
787
|
+
required: z.boolean().default(true),
|
|
788
|
+
})
|
|
789
|
+
.strict();
|
|
790
|
+
export const dagTaskSchema = z.object({
|
|
791
|
+
id: z.string().regex(/^[a-z][a-z0-9-]*$/, "task id must be kebab-case"),
|
|
736
792
|
depends_on: z.array(z.string()).default([]),
|
|
737
793
|
/**
|
|
738
794
|
* How SKIPPED upstreams affect readiness.
|
|
@@ -776,10 +832,34 @@ export const dagTaskSchema = z.object({ id: z.string().regex(/^[a-z][a-z0-9-]*$/
|
|
|
776
832
|
commandPolicy: dagCommandPolicySchema.optional(),
|
|
777
833
|
writePolicy: dagWritePolicySchema.optional(),
|
|
778
834
|
writeSet: z.array(z.string()).optional(),
|
|
835
|
+
/** Strict repository-relative read allowlist for bounded Pi nodes. */
|
|
836
|
+
readSet: z.array(z.string()).optional(),
|
|
837
|
+
/**
|
|
838
|
+
* Online per-attempt Pi context guard. Unlike run/map cost budgets, this
|
|
839
|
+
* aborts the active SDK session before an oversized conversation reaches
|
|
840
|
+
* the provider's context rejection boundary.
|
|
841
|
+
*/
|
|
842
|
+
contextBudget: z
|
|
843
|
+
.object({
|
|
844
|
+
maxTurns: z.number().int().positive().optional(),
|
|
845
|
+
maxTokens: z.number().int().positive().optional(),
|
|
846
|
+
})
|
|
847
|
+
.strict()
|
|
848
|
+
.refine((value) => value.maxTurns !== undefined || value.maxTokens !== undefined, "contextBudget requires maxTurns or maxTokens")
|
|
849
|
+
.optional(),
|
|
779
850
|
piStep: z.string().optional(),
|
|
780
851
|
shell: dagShellConfigSchema.optional(),
|
|
781
852
|
static: dagStaticConfigSchema.optional(),
|
|
782
853
|
outputContract: z.string().optional(),
|
|
854
|
+
/**
|
|
855
|
+
* Frozen producer declarations for run-owned artifacts. These declarations,
|
|
856
|
+
* together with consumesArtifacts, are the only authority for artifact
|
|
857
|
+
* lineage and impact analysis. Prompt/outputContract/path heuristics are
|
|
858
|
+
* intentionally forbidden.
|
|
859
|
+
*/
|
|
860
|
+
producesArtifacts: z.array(dagProducedArtifactSchema).optional(),
|
|
861
|
+
/** Frozen logical artifact inputs consumed by this node. */
|
|
862
|
+
consumesArtifacts: z.array(dagConsumedArtifactSchema).optional(),
|
|
783
863
|
outputMode: dagOutputModeSchema.optional(),
|
|
784
864
|
firstProtocolLine: z.string().min(1).optional(),
|
|
785
865
|
/**
|
|
@@ -808,8 +888,7 @@ export const dagTaskSchema = z.object({ id: z.string().regex(/^[a-z][a-z0-9-]*$/
|
|
|
808
888
|
})
|
|
809
889
|
.strict()
|
|
810
890
|
.superRefine((value, ctx) => {
|
|
811
|
-
if (value.schemaId ===
|
|
812
|
-
"frontend-implementation-contract-plan-patch-v1" &&
|
|
891
|
+
if (value.schemaId === "frontend-implementation-contract-plan-patch-v1" &&
|
|
813
892
|
!value.skeleton) {
|
|
814
893
|
ctx.addIssue({
|
|
815
894
|
code: "custom",
|
|
@@ -864,6 +943,121 @@ export const dagTaskSchema = z.object({ id: z.string().regex(/^[a-z][a-z0-9-]*$/
|
|
|
864
943
|
dynamicCondition: dagDynamicConditionSchema.optional(),
|
|
865
944
|
dynamicLoopUntil: dagDynamicLoopUntilSchema.optional(),
|
|
866
945
|
});
|
|
946
|
+
function hasTransitiveDependency(tasksById, consumerNodeId, producerNodeId) {
|
|
947
|
+
const queue = [...(tasksById.get(consumerNodeId)?.depends_on ?? [])];
|
|
948
|
+
const seen = new Set();
|
|
949
|
+
while (queue.length > 0) {
|
|
950
|
+
const nodeId = queue.shift();
|
|
951
|
+
if (nodeId === producerNodeId)
|
|
952
|
+
return true;
|
|
953
|
+
if (seen.has(nodeId))
|
|
954
|
+
continue;
|
|
955
|
+
seen.add(nodeId);
|
|
956
|
+
queue.push(...(tasksById.get(nodeId)?.depends_on ?? []));
|
|
957
|
+
}
|
|
958
|
+
return false;
|
|
959
|
+
}
|
|
960
|
+
function validateFrozenArtifactBindings(tasks, ctx) {
|
|
961
|
+
const tasksById = new Map(tasks.map((task) => [task.id, task]));
|
|
962
|
+
const producers = new Map();
|
|
963
|
+
const paths = new Map();
|
|
964
|
+
for (const [taskIndex, task] of tasks.entries()) {
|
|
965
|
+
const localIds = new Set();
|
|
966
|
+
for (const [artifactIndex, artifact] of (task.producesArtifacts ?? []).entries()) {
|
|
967
|
+
if (localIds.has(artifact.artifactId) ||
|
|
968
|
+
producers.has(artifact.artifactId)) {
|
|
969
|
+
ctx.addIssue({
|
|
970
|
+
code: z.ZodIssueCode.custom,
|
|
971
|
+
path: [
|
|
972
|
+
"tasks",
|
|
973
|
+
taskIndex,
|
|
974
|
+
"producesArtifacts",
|
|
975
|
+
artifactIndex,
|
|
976
|
+
"artifactId",
|
|
977
|
+
],
|
|
978
|
+
message: `artifact ${artifact.artifactId} must have exactly one producer`,
|
|
979
|
+
});
|
|
980
|
+
}
|
|
981
|
+
else {
|
|
982
|
+
producers.set(artifact.artifactId, {
|
|
983
|
+
nodeId: task.id,
|
|
984
|
+
taskIndex,
|
|
985
|
+
artifactIndex,
|
|
986
|
+
path: artifact.path,
|
|
987
|
+
});
|
|
988
|
+
}
|
|
989
|
+
localIds.add(artifact.artifactId);
|
|
990
|
+
const foldedPath = artifact.path
|
|
991
|
+
.normalize("NFC")
|
|
992
|
+
.toLocaleLowerCase("en-US");
|
|
993
|
+
const existingArtifactId = paths.get(foldedPath);
|
|
994
|
+
if (existingArtifactId && existingArtifactId !== artifact.artifactId) {
|
|
995
|
+
ctx.addIssue({
|
|
996
|
+
code: z.ZodIssueCode.custom,
|
|
997
|
+
path: [
|
|
998
|
+
"tasks",
|
|
999
|
+
taskIndex,
|
|
1000
|
+
"producesArtifacts",
|
|
1001
|
+
artifactIndex,
|
|
1002
|
+
"path",
|
|
1003
|
+
],
|
|
1004
|
+
message: `artifact path collides with ${existingArtifactId} under case folding`,
|
|
1005
|
+
});
|
|
1006
|
+
}
|
|
1007
|
+
else {
|
|
1008
|
+
paths.set(foldedPath, artifact.artifactId);
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
for (const [taskIndex, task] of tasks.entries()) {
|
|
1013
|
+
const consumed = new Set();
|
|
1014
|
+
for (const [artifactIndex, binding] of (task.consumesArtifacts ?? []).entries()) {
|
|
1015
|
+
if (consumed.has(binding.artifactId)) {
|
|
1016
|
+
ctx.addIssue({
|
|
1017
|
+
code: z.ZodIssueCode.custom,
|
|
1018
|
+
path: [
|
|
1019
|
+
"tasks",
|
|
1020
|
+
taskIndex,
|
|
1021
|
+
"consumesArtifacts",
|
|
1022
|
+
artifactIndex,
|
|
1023
|
+
"artifactId",
|
|
1024
|
+
],
|
|
1025
|
+
message: `artifact ${binding.artifactId} is consumed more than once by ${task.id}`,
|
|
1026
|
+
});
|
|
1027
|
+
}
|
|
1028
|
+
consumed.add(binding.artifactId);
|
|
1029
|
+
const producer = producers.get(binding.artifactId);
|
|
1030
|
+
if (!producer) {
|
|
1031
|
+
ctx.addIssue({
|
|
1032
|
+
code: z.ZodIssueCode.custom,
|
|
1033
|
+
path: [
|
|
1034
|
+
"tasks",
|
|
1035
|
+
taskIndex,
|
|
1036
|
+
"consumesArtifacts",
|
|
1037
|
+
artifactIndex,
|
|
1038
|
+
"artifactId",
|
|
1039
|
+
],
|
|
1040
|
+
message: `artifact ${binding.artifactId} has no declared producer`,
|
|
1041
|
+
});
|
|
1042
|
+
continue;
|
|
1043
|
+
}
|
|
1044
|
+
if (producer.nodeId === task.id ||
|
|
1045
|
+
!hasTransitiveDependency(tasksById, task.id, producer.nodeId)) {
|
|
1046
|
+
ctx.addIssue({
|
|
1047
|
+
code: z.ZodIssueCode.custom,
|
|
1048
|
+
path: [
|
|
1049
|
+
"tasks",
|
|
1050
|
+
taskIndex,
|
|
1051
|
+
"consumesArtifacts",
|
|
1052
|
+
artifactIndex,
|
|
1053
|
+
"artifactId",
|
|
1054
|
+
],
|
|
1055
|
+
message: `consumer ${task.id} must be downstream of producer ${producer.nodeId}`,
|
|
1056
|
+
});
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
867
1061
|
export const dagModelsSchema = z
|
|
868
1062
|
.object({
|
|
869
1063
|
HIGH: z.string().optional(),
|
|
@@ -893,9 +1087,7 @@ export const dagBudgetSchema = campaignBudgetSchema;
|
|
|
893
1087
|
export const dagSourceBindingSourceSchema = z.object({
|
|
894
1088
|
kind: z.enum(["requirement", "constraint", "reference"]),
|
|
895
1089
|
path: z.string().min(1),
|
|
896
|
-
sha256: z
|
|
897
|
-
.string()
|
|
898
|
-
.regex(/^[a-f0-9]{64}$/, "sha256 must be lowercase hex"),
|
|
1090
|
+
sha256: z.string().regex(/^[a-f0-9]{64}$/, "sha256 must be lowercase hex"),
|
|
899
1091
|
});
|
|
900
1092
|
/**
|
|
901
1093
|
* DagSourceBinding v1:无 ledger 字段(schemaVersion=1,.strict() 拒绝 ledger
|
|
@@ -997,6 +1189,8 @@ export const dagSpecSchema = z
|
|
|
997
1189
|
taskContractBinding: dagTaskContractBindingSchema.optional(),
|
|
998
1190
|
/** Optional unresolved parent-run feedback for a full task rerun. */
|
|
999
1191
|
rerunFeedback: dagRerunFeedbackSchema.optional(),
|
|
1192
|
+
/** Backend-test-only workspace mutation control; absent means Git. */
|
|
1193
|
+
backendTestWorkspaceControl: z.enum(["git", "filesystem-only"]).optional(),
|
|
1000
1194
|
/** Frozen backend-test artifact layout (plan A); absent = historical default testcase/ layout. */
|
|
1001
1195
|
backendTestLayout: z
|
|
1002
1196
|
.object({
|
|
@@ -1044,6 +1238,7 @@ export const dagSpecSchema = z
|
|
|
1044
1238
|
})
|
|
1045
1239
|
.superRefine((spec, ctx) => {
|
|
1046
1240
|
const supportsV3Fields = spec.version === 3 || spec.version === 4;
|
|
1241
|
+
validateFrozenArtifactBindings(spec.tasks, ctx);
|
|
1047
1242
|
if (spec.evaluation && !supportsV3Fields) {
|
|
1048
1243
|
ctx.addIssue({
|
|
1049
1244
|
code: z.ZodIssueCode.custom,
|
package/docs/README.md
CHANGED
|
@@ -73,6 +73,7 @@
|
|
|
73
73
|
| `design/active/` | 仍会影响后续决策的设计输入、路线与契约 |
|
|
74
74
|
| `design/visual-references/` | 长期视觉参考,不表达实现状态 |
|
|
75
75
|
| `design/archive/` | 历史设计和已被实现/替代的阶段性设计 |
|
|
76
|
+
| `superpowers/specs/` | Superpowers 工作流产出的阶段性实现设计输入 |
|
|
76
77
|
| `exec-plans/active/` | 仍需推进或明确保持 open 的任务合同 |
|
|
77
78
|
| `exec-plans/completed/` | 已完成任务合同归档 |
|
|
78
79
|
| `progress/` | 仍需下一次会话接手的当前 handoff 入口 |
|
|
@@ -160,18 +160,18 @@ Runner / Loop ──(迁移中)──> 逐步改为仅经 Store / Appli
|
|
|
160
160
|
|
|
161
161
|
| From | May import | Must not import |
|
|
162
162
|
| ------ | ------------ | ----------------- |
|
|
163
|
-
| `src/commands/**` | application, workflows, infrastructure, task, records, executors, shared |
|
|
164
|
-
| `src/workflows/**` | executors, task, records, shared, application(目标) | `src/commands/**` |
|
|
163
|
+
| `src/commands/**` | application, workflows, infrastructure, task, records, executors, shared | `src/worker/**` |
|
|
164
|
+
| `src/workflows/**` | executors, task, records, shared, infrastructure, application(目标) | `src/commands/**` |
|
|
165
165
|
| `src/executors/**` | shared, 外部 SDK | `src/commands/**`, `src/cli/**` |
|
|
166
|
-
| `src/worker/**` | worker-local modules, task contracts, shared, Node APIs | `src/commands/**`, `src/cli/**`, `src/application/**` |
|
|
167
|
-
| `src/cli/**` | commands, adapters, shared, application(目标) | — |
|
|
166
|
+
| `src/worker/**` | worker-local modules, task contracts, shared, infrastructure, Node APIs | `src/commands/**`, `src/cli/**`, `src/application/**` |
|
|
167
|
+
| `src/cli/**` | commands, adapters, shared, infrastructure, application(目标) | — |
|
|
168
168
|
| `.agents/skills/**` | (Markdown 引用,非 TS import) | 运行时 TS 模块 |
|
|
169
169
|
|
|
170
170
|
## 已知过渡耦合
|
|
171
171
|
|
|
172
|
-
当前没有允许的 `src/workflows/**` / `src/executors/**` forbidden import,也没有允许的 `src/worker/**` → `src/{cli,commands,application}/**` TypeScript import。
|
|
172
|
+
当前没有允许的 `src/workflows/**` / `src/executors/**` forbidden import,也没有允许的 `src/worker/**` → `src/{cli,commands,application}/**` 或 `src/commands/**` → `src/worker/**` TypeScript import。Console app-data 存储(operations、context exports、artifact revisions、app-data path helpers)位于 `src/infrastructure/console/**`,由 Console(worker 层)与 CLI 命令共同向下依赖;Console 专属的 route/action 编排仍留在 `src/worker/console/**`。
|
|
173
173
|
|
|
174
|
-
`scripts/check-architecture-boundaries.sh` 的 transitional allowlist 保持为空。任何新增的 `workflows/executors/worker` forbidden import 必须导致检查 **exit 1**;如果未来确有临时例外,必须先写入 active exec plan,说明移除时间和验证门禁。
|
|
174
|
+
`scripts/check-architecture-boundaries.sh` 的 transitional allowlist 保持为空。任何新增的 `workflows/executors/worker/commands` forbidden import 必须导致检查 **exit 1**;如果未来确有临时例外,必须先写入 active exec plan,说明移除时间和验证门禁。
|
|
175
175
|
|
|
176
176
|
## Governance 钩子
|
|
177
177
|
|
|
@@ -61,7 +61,7 @@ controller identity 与 DAG skill snapshot 是两个不同冻结层(前者跨
|
|
|
61
61
|
|
|
62
62
|
- schema/validate:`src/worker/task-spec/{schema,validate}.ts`。
|
|
63
63
|
- 校验验收条件、依赖、验证命令;`agent-worker task validate-feature` 等用之。
|
|
64
|
-
- **0.16.0+**:可选 `execution.workflow` 映射到 loop-agent `taskKind
|
|
64
|
+
- **0.16.0+**:可选 `execution.workflow` 映射到 loop-agent `taskKind`(agent-dag / frontend-implementation / backend-test-analysis / backend-test / frontend-test);`backend-test-analysis` 只读生成严格 analysis artifact,不执行测试;typed Task Outcome 与 artifact-aware Ready 门禁见 completed `2026-07-19-taskspec-workflow-routing.md`。
|
|
65
65
|
- 文档映射镜像:`docs/architecture/taskspec-to-loop-agent-mapping.md`(runtime 真源仍在 `src/worker/` 与 materialize 路径)。
|
|
66
66
|
|
|
67
67
|
### Task Pool
|
|
@@ -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 安装一次:
|
|
@@ -483,6 +483,28 @@
|
|
|
483
483
|
"sha256": { "type": "string", "minLength": 1 }
|
|
484
484
|
}
|
|
485
485
|
},
|
|
486
|
+
"producedArtifact": {
|
|
487
|
+
"type": "object",
|
|
488
|
+
"additionalProperties": false,
|
|
489
|
+
"required": ["artifactId", "kind", "path", "mediaType", "revisionPolicy"],
|
|
490
|
+
"properties": {
|
|
491
|
+
"artifactId": { "type": "string", "pattern": "^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)*$" },
|
|
492
|
+
"kind": { "enum": ["structured", "assistant", "stdout"] },
|
|
493
|
+
"path": { "type": "string", "pattern": "^(?!/)(?![A-Za-z]:)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\).+$" },
|
|
494
|
+
"mediaType": { "type": "string", "minLength": 1 },
|
|
495
|
+
"schemaId": { "type": "string", "minLength": 1 },
|
|
496
|
+
"revisionPolicy": { "enum": ["immutable", "replace-file"] }
|
|
497
|
+
}
|
|
498
|
+
},
|
|
499
|
+
"consumedArtifact": {
|
|
500
|
+
"type": "object",
|
|
501
|
+
"additionalProperties": false,
|
|
502
|
+
"required": ["artifactId"],
|
|
503
|
+
"properties": {
|
|
504
|
+
"artifactId": { "type": "string", "pattern": "^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)*$" },
|
|
505
|
+
"required": { "type": "boolean", "default": true }
|
|
506
|
+
}
|
|
507
|
+
},
|
|
486
508
|
"task": {
|
|
487
509
|
"type": "object",
|
|
488
510
|
"additionalProperties": false,
|
|
@@ -538,6 +560,24 @@
|
|
|
538
560
|
"type": "array",
|
|
539
561
|
"items": { "type": "string", "minLength": 1 }
|
|
540
562
|
},
|
|
563
|
+
"readSet": {
|
|
564
|
+
"type": "array",
|
|
565
|
+
"items": { "type": "string", "minLength": 1 },
|
|
566
|
+
"description": "Strict repository-relative read allowlist for bounded Pi nodes."
|
|
567
|
+
},
|
|
568
|
+
"contextBudget": {
|
|
569
|
+
"type": "object",
|
|
570
|
+
"additionalProperties": false,
|
|
571
|
+
"description": "Online per-attempt Pi SDK conversation guard. At least one threshold is required; exhaustion aborts the active session with context-budget-exhausted partial evidence.",
|
|
572
|
+
"properties": {
|
|
573
|
+
"maxTurns": { "type": "integer", "minimum": 1 },
|
|
574
|
+
"maxTokens": { "type": "integer", "minimum": 1 }
|
|
575
|
+
},
|
|
576
|
+
"anyOf": [
|
|
577
|
+
{ "required": ["maxTurns"] },
|
|
578
|
+
{ "required": ["maxTokens"] }
|
|
579
|
+
]
|
|
580
|
+
},
|
|
541
581
|
"piStep": {
|
|
542
582
|
"type": "string",
|
|
543
583
|
"minLength": 1
|
|
@@ -552,6 +592,16 @@
|
|
|
552
592
|
"type": "string",
|
|
553
593
|
"minLength": 1
|
|
554
594
|
},
|
|
595
|
+
"producesArtifacts": {
|
|
596
|
+
"type": "array",
|
|
597
|
+
"items": { "$ref": "#/$defs/producedArtifact" },
|
|
598
|
+
"description": "Frozen producer declarations. Artifact lineage and impact analysis must use these declarations, never prompt/outputContract/path heuristics."
|
|
599
|
+
},
|
|
600
|
+
"consumesArtifacts": {
|
|
601
|
+
"type": "array",
|
|
602
|
+
"items": { "$ref": "#/$defs/consumedArtifact" },
|
|
603
|
+
"description": "Frozen logical artifact inputs consumed by this node."
|
|
604
|
+
},
|
|
555
605
|
"outputMode": {
|
|
556
606
|
"enum": ["default", "structured-required"],
|
|
557
607
|
"description": "Optional output semantics for Pi nodes. structured-required means oversized assistant output must not be accepted as a truncated success; eligible read-only nodes may compact-retry and downstream gates should rely on canonical structured artifacts."
|